SQL 使用 COUNT() 查询子查询

SQL Query subquery with COUNT()

我正在尝试 return 只有 79 行的 'conm'。

这是我的查询:

SELECT *
FROM combinedata1 
WHERE EXISTS (    
    SELECT conm, COUNT(conm) AS 'Number of Rows'
    FROM combinedata1 
    GROUP BY conm
    HAVING COUNT(conm) = 79
)
ORDER BY conm ASC

显然,这几乎是 return 的所有内容,忽略了 conm 的 79 行。

任何人都可以阐明这一点吗?

谢谢。

您应该在 exists 中包含 where,如下所示

SELECT *
FROM combinedata1 c1
WHERE EXISTS
(
    SELECT c2.conm, COUNT(c2.conm) AS 'Number of Rows'
    FROM combinedata1 c2
    WHERE c1.conm = c2.conm
    GROUP BY c2.conm
    HAVING COUNT(c2.conm) = 79
)
ORDER BY conm ASC
SELECT *
FROM
(
SELECT conm, COUNT(conm) AS 'Number_of_Rows'
FROM combinedata1 
GROUP BY conm
)
WHERE Number_of_Rows = 79;

我发现使用标量子查询比使用 exists:

更简单
select c.*
from combinedata1 c
where (select count(*) from combinedata1 where c1.conm = c.conm) = 79

子查询只是统计在table中可以找到多少行conm:这个returns一个标量值(计数),可以直接过滤在。此查询将利用 conm.

上的索引

您还可以使用 window 函数:

select *
from (select c.*, count(*) over(partition by conm) cnt from combinedata1 c) c
where cnt = 79

首先,您的查询将返回所有内容,因为这就是 EXISTS 的工作方式。子查询与外部查询无关。因此,要么返回所有行(如果子查询 returns 任何行),要么不返回任何行。

您可以使用相关子查询解决此问题。但是 window 函数查询起来更快更简单:

SELECT c.*
FROM (SELECT c.*, COUNT(*) OVER (PARTITION BY conm) as cnt
      FROM combinedata1 c
     ) c
WHERE cnt = 79;
ORDER BY conm ASC;