繁体   English   中英

sql查询联接,其中许多都不满足条件

[英]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)

要使用进行测试的SQLfiddle

基本上,这只是对所有表进行直接连接,将结果按客户和项目分组。 然后,它使用NOT MAX(t3.active)来检查组中的所有布尔值是否为false。

此版本选择不返回没有任何活动标志要检查的客户端/项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM