【发布时间】:2017-11-04 02:51:37
【问题描述】:
我有两张桌子:
产品
- id_product
- 说明
- 价格
- id_category
类别
- id_category
- 说明
我想知道有更多产品的类别。例如,食品类别有 10 种产品,电子产品也有。它们是一样的。
现在我使用的是 SQL Server,我使用的是 TOP WITH TIES。
SELECT TOP 1 WITH TIES p.id_category, COUNT(*) as amount FROM product p
JOIN category c ON p.id_category = c.id_category
GROUP BY p.id_category
ORDER BY amount
还有其他方法可以以良好的性能解决这个问题吗? 我也尝试使用 DENSE_RANK 位置 = 1。 它也有效。
SELECT * FROM (
SELECT p.id_category, COUNT(*) as amount, DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) position FROM product p
JOIN category c ON p.id_category = c.id_category
GROUP BY p.id_category
) rnk
WHERE rnk.position = 1
但我想在 SQL ANSI 中使用这个解决方案。
我尝试使用 MAX(COUNT(*)) 但它不起作用。
有没有通用的解决方案?这个解决方案比使用 TOP WITH TIES 更好吗?
【问题讨论】:
-
你使用
MAX(COUNT(*))的时候,有没有试过在HAVING使用? -
密集秩 是 ANSI SQL 标准的一部分,只有在您使用 MySQL 或少数其他数据库时才可用。依赖密集秩有什么问题?
-
我尝试使用 SUBSELECT ON 必须获得最大值。但是我应该重复代码吗?
-
哦,我不知道!我以为 DENSE_RANK 只是一个 SQL SERVER 函数。但是没有其他使用子查询的方法吗?我想比较一下性能。
-
dense_rank()是要走的路。它不是特定于 SQL Server 的函数,例如在 SQL Server 知道它存在之前,Oracle 已经存在很长时间了
标签: sql sql-server subquery