【问题标题】: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/…

标签: sql postgresql relational-division


【解决方案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,这行得通,虽然我希望得到一个不涉及子查询的更简单的答案,但也许这是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多