找到所有有红球和蓝球的罐子
Posted
技术标签:
【中文标题】找到所有有红球和蓝球的罐子【英文标题】:Find all jars that have red balls and blue balls 【发布时间】:2021-05-08 12:11:27 【问题描述】:通过这个简单的查询,我可以找到所有包含 红球或蓝球的罐子的 ID:
SELECT id FROM "Jars" J
JOIN "Balls" B ON B.jarId = J.jarId
WHERE B.color = 'red' OR B.color = 'blue'
GROUP BY id
我如何找到所有包含 红球和蓝球的罐子的 ID?
【问题讨论】:
与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/… 【参考方案1】:您不需要子查询。您甚至不需要 JOIN,因为您只需要罐子的 ID(可在 balls
表中找到)
select b.jarid
from balls b
where b.color in ('blue', 'red')
group by b.jarid
having count(*) = 2
请注意,这也会返回具有其他颜色(例如蓝色、红色和黄色)的球。
如果你只想要那些完全蓝色和红色的,你可以使用这个:
select jarid
from balls
group by jarid
having count(*) = 2
and bool_and(color in ('blue', 'red'))
【讨论】:
【参考方案2】:如果两者都是你想要的,那就试试吧:
SELECT id
FROM (
SELECT j.id,
COUNT(CASE WHEN b.colour = 'red' THEN b.id ELSE NULL END) as reds,
COUNT(CASE WHEN b.colour = 'blue' THEN b.id ELSE NULL END) as blues
FROM Jars j INNER JOIN Balls b ON j.jarId = b.jarId
WHERE b.color IN ('red', 'blue')
GROUP BY j.id) tmp
WHERE tmp.reds > 0 and tmp.blues > 0;
【讨论】:
ty,这行得通,虽然我希望得到一个不涉及子查询的更简单的答案,但也许这是不可能的。以上是关于找到所有有红球和蓝球的罐子的主要内容,如果未能解决你的问题,请参考以下文章