计算 table a 中具有两个完全匹配元素的 table b 中的元素

Count elements in table a that have two exactly matching elements in table b

我有两个 tables 并且需要从 table A 中获取在 table B 中有两个特定匹配项的所有条目的计数。Table B 有tables A 的 Id 作为外键。

Table a
ID       Name
1        Foo
2        Bar
3        John
4        Jane

Table b
aID     Value
1       12
1       12
2       8
3       8
3       12
4       12
4       8

我现在需要对 table A 中所有在 table B 中同时具有值​​ 8 和 12 的名称至少计算一次。

SELECT COUNT(*) FROM a join b on a.id = b.aId where b.value = 8 and b.value = 12 

得到 0 个结果。正确的结果应该是 2(约翰和简)。

编辑: 显然,@Larnu 是正确的,8 永远不会是 12。

此外,我应该澄清一下,对于任何 table A id,table B 中的单个值可以有两个或多个,但另一个 none(例如8 两次但没有 12)。我更新了 table 以反映这一点。

您可以使用 EXISTSHAVING:

SELECT COUNT(*) FROM a
WHERE EXISTS(SELECT b.aID FROM b
             WHERE a.ID = b.aID
             GROUP BY b.aID
             HAVING COUNT(*) = 2)

如果您特别想要 value = 8 or 12,则将 AND b.value IN(8,12) 添加到内部查询

加入不是这里的答案。您需要一个包含相关子查询的 WHERE 子句,该子查询使用 COUNT() 或 EXISTS() 检查您的条件。应执行以下操作之一。

SELECT COUNT(*) FROM A
WHERE (SELECT COUNT(*) ​FROM B ​WHERE B.aID = A.ID ​AND B.VALUE IN (8, 12)) = 2
SELECT COUNT(*) FROM A
WHERE EXISTS(SELECT * FROM B WHERE B.aID = A.ID AND B.VALUE = 8)
AND EXISTS(SELECT * FROM B WHERE B.aID = A.ID AND B.VALUE = 12)

获取每行出现 8 和 12 的次数的子查询就可以解决问题:

select count(id) from 
(select id, sum(case when b.Value = 8 then 1 else 0 end) as ct8,
sum(case when b.Value = 12 then 1 else 0 end) as ct12
from a inner join b on a.id = b.aID
group by a.id) as t
where ct8 >= 1 and ct12 >=1

Fiddle