return foo 仅当所有连接的条具有相同的列值时

return foo only if all joined bar have the same column value

我有 2 个表 foobar,两者之间是一对多的关系。我想获得一个 foos 列表,其中所有相应的条都有一列 status = 'CLOSED'。我应该如何编写该查询?

SELECT f.* 
FROM foo f
JOIN bar b ON b.foo_bk = f.bk
WHERE b.status = 'CLOSED'

当前查询将 return foo,即使它有一个 bar 具有不同的 status 值。我一直在查看 CASEIF 查询,但我不知道如何让它们在这种情况下工作。

尝试添加如下子查询

SELECT f.* 
FROM foo f
JOIN bar b ON b.foo_bk = f.f_bk
WHERE b.status = 'CLOSED'
AND not exists (select 1
                from bar b2
                where b2.foo_bk = f.f_bk
                and b.status <> 'CLOSED')
SELECT f.* FROM foo f
JOIN bar b ON b.foo_bk = f.f_bk
WHERE f.f_bk IN (SELECT b.bk FROM bar b WHERE b.status = 'CLOSED')
AND f.f_bk NOT IN (SELECT b.bk FROM bar b WHERE b.status <> 'CLOSED')

此查询将为您提供状态为 'CLOSED' 的栏中存在的所有行,同时忽略其他状态的行。