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;
我正在尝试 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;