sql查询连接,其中没有一个符合条件

时间:2014-10-07 16:01:56

标签: sql join

我有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

4 个答案:

答案 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)

An SQLfiddle to test with

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

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