SQL左外连接但检测哪些行被“填充”为空

时间:2014-09-08 23:07:39

标签: sql postgresql join

我有一个带有一对多关系的SQL LEFT OUTER JOIN。这是一个例子

表A

+------+------+------+
| Col1 | Col2 | Col3 |
+------+------+------+
| a1   | a2   | a3   |
| b1   | b2   | b3   |
| c1   | c2   | c3   |
+------+------+------+

表B

+------+------+------+
| Col1 | Col2 | Col3 |
+------+------+------+
| x1   | a2   | NULL |
| y1   | b2   | y3   |
+------+------+------+

我正在Col2上加入表格,所以:

SELECT * FROM tableA
LEFT OUTER JOIN tableB ON tableA.col2 = tableB.col2
WHERE tableB.col3 IS NOT NULL

此查询按预期返回tableA的第二行。我的问题是我还需要tableA的第3行,因为它在tableB上没有相关记录。由于JOIN条款是"填充"如果找不到关联,则返回null,则查询不返回该行。总而言之,我需要来自表A的所有记录,这些记录具有来自表B和tableB.col3的关联记录IS NOT NULL,以及表B中表B上没有关联记录的所有记录。

预期产出(我需要的):

+------+------+------+
| b1   | b2   | b3   |
| c1   | c2   | c3   |
+------+------+------+

有关如何检索此内容的任何想法?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我将这个问题解释为:

  

我需要表A中包含相关记录的所有记录   表B AND tableB.col3 IS NULL和来自表A的所有记录   表B中没有相关记录。

这更具挑战性。我认为以下查询实现了逻辑:

SELECT *
FROM tableA a LEFT JOIN
     tableB b
     ON a.col2 = b.col2
WHERE (a.col2 = b.col2 and b.col3 is null) or
      (b.col2 is null)

编辑:

根据您的修改,您似乎想要:

  

我需要表A中包含相关记录的所有记录   表B AND tableB.col3 IS NOT NULL并且表A中的所有记录都有   表B中没有相关记录。

SELECT *
FROM tableA a LEFT JOIN
     tableB b
     ON a.col2 = b.col2
WHERE (a.col2 = b.col2 and b.col3 is not null) or
      (b.col2 is null)

答案 1 :(得分:1)

根据您的修改:

select a.col1, a.col2, a.col3
  from tablea a
  left join tableb b
    on a.col2 = b.col2
 where b.col3 is not null
    or b.col2 is null

<强>小提琴: http://sqlfiddle.com/#!15/e98a5/12/0