【问题标题】:SQL left outer join but detect what row were "filled" with nullsSQL 左外连接,但检测到哪些行“填充”了空值
【发布时间】:2014-09-08 23:07:39
【问题描述】:

我有一个具有一对多关系的 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 子句在未找到关联时用空值“填充”,因此查询不会返回该行。总而言之,我需要表 A 中的所有记录,这些记录具有表 B 中的关联记录,并且 tableB.col3 不为空,并且表 B 中的所有记录在表 B 上没有关联记录。

预期输出(我需要的):

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

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

感谢您的帮助!

【问题讨论】:

  • 您的意思是在较长段落的末尾“以及表 A 中 [do] 在表 B 上没有关联记录的所有记录”吗?
  • 是的,我就是这个意思。编辑了帖子。

标签: sql postgresql join


【解决方案1】:

我将问题解释为:

我需要表 A 中具有关联记录的所有记录 表 B AND tableB.col3 IS NULL AND 表 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 AND 表 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)

【讨论】:

  • 啊,所以当连接发生时,b.col2 将为空,因为它不匹配表 b 上的任何记录?
  • @Ziggurat 。 . .是的。在检查 join 是否与行匹配时,最好使用 join 本身的键。
【解决方案2】:

根据您的编辑:

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

【讨论】:

  • 对不起,将编辑问题,我实际上使用左外连接。并且建议的 ON 已经在句子中。问题是当没有与表 A 记录关联的记录时。我也需要它,但由于非空条件,连接正在过滤它。
  • @Ziggurat 您的问题在其他地方也自相矛盾。请提供预期的输出,因为这是了解您想要什么的最清晰的方式。
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多