[英]sql query join where none of the many meet a condition
我有3张桌子。 在第一个表上,每个项目都有多个条目。 第二个基本上是一个映射表。 比这要复杂得多,但是对于这个例子,我已经简化了。 我要在表2上检查一个简单的条件。在第三个表上,每个条目都有一个设置为true或false的标志。 我想返回第一个表上的行,其中第三个表上的所有匹配行均为false。 在下面的示例中,结果将返回项目A b / c,表3中Jane和Fred的所有行均为false,但没有其他行,因为每个其他项目在表3中均至少有一个真实条目。
Project | Client name | id id | active
--------------- ---------------- ---------------
A | Jane John | 1 1 | false
A | Fred Jane | 2 1 | true
B | Mary Fred | 3 2 | false
B | Jane Mary | 4 2 | false
C | John 3 | false
C | Jane 3 | false
D | Jane 4 | true
D | Mary 4 | false
D | John
D | Fred
以下应该做您想要的:
select t1.*
from table1 t1
where not exists (select 1
from table2 t2 join
table3 t3
on t2.id = t3.id
where t2.name = t1.name and t3.active <> false
);
当其中一个join
失败时(该条件在样本数据中不存在)该怎么办是有歧义的。 这将返回该行,因为即使在这种情况下,第三个表中的所有匹配行都为false。
SELECT t1.* FROM t1
INNER JOIN t2 ON t1.Client = t2.name
WHERE t2.id IN (
SELECT id FROM t3
GROUP BY id, active
HAVING SUM(CASE active WHEN false THEN 1 ELSE 0 END) = COUNT(1)
)
您必须使用两个联接和一个简单的WHERE条件从第一个表中进行选择:
SELECT
res.Project
FROM
(SELECT
table1.Project,
BOOL_OR(res) as active
FROM
table1
JOIN table2 ON table2.name=table1.Client
JOIN table3 ON table3.id=table2.id
GROUP BY table1.Project
) as res
WHERE
res.active=FALSE
一个相当简单的JOIN with HAVING应该会给您想要的结果;
SELECT t1.project, t1.client
FROM table1 t1
JOIN table2 t2 ON t1.client = t2.name
JOIN table3 t3 ON t2.id = t3.id
GROUP BY t1.project, t1.client
HAVING NOT MAX(t3.active)
基本上,这只是对所有表进行直接连接,将结果按客户和项目分组。 然后,它使用NOT MAX(t3.active)来检查组中的所有布尔值是否为false。
此版本选择不返回没有任何活动标志要检查的客户端/项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.