我有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
答案 0 :(得分:1)
以下应该做你想做的事:
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,即使在这种情况下也是如此。
答案 1 :(得分:0)
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)
)
答案 2 :(得分:0)
您必须从第一个表中选择两个连接和一个简单的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
答案 3 :(得分:0)
使用HAVING的相当直接的JOIN应该会给你想要的结果;
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)检查组中的所有布尔值是否为假。
此版本选择不返回没有任何活动标志的客户端/项目进行检查。