我有一个带有一对多关系的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 |
+------+------+------+
有关如何检索此内容的任何想法?
感谢您的帮助!
答案 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