计算 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 以反映这一点。
您可以使用 EXISTS
和 HAVING
:
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
我有两个 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 以反映这一点。
您可以使用 EXISTS
和 HAVING
:
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