带有count()的sql查询子查询

vdgimpew  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(387)

我试图返回只有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

显然,这是返回几乎所有的东西,忽略了 conm 有79排。
有人能解释一下吗?
谢谢。

ctzwtxfj

ctzwtxfj1#

你应该有 where 内部 exists 如下所示

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
oalqel3c

oalqel3c2#

首先,您的查询将返回所有内容,因为这就是 EXISTS 工作。子查询与外部查询不相关。因此,要么返回所有行(如果子查询返回任何行),要么不返回任何行。
你可以用一个相关的子查询来解决这个问题。但是,窗口函数的查询速度更快、更简单:

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

bq3bfh9z3#

我发现用标量子查询来表示比用标量子查询更简单 exists :

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

子查询只计算有多少行具有相同的 conm 可以在表中找到:它返回一个标量值(计数),您可以直接对其进行筛选。此查询将利用上的索引 conm .
您还可以使用窗口功能:

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

sqougxex4#

SELECT *
FROM
(
SELECT conm, COUNT(conm) AS 'Number_of_Rows'
FROM combinedata1 
GROUP BY conm
)
WHERE Number_of_Rows = 79;

相关问题