【问题标题】:Redshift left outer join is leaving out nullsRedshift左外连接忽略了空值
【发布时间】:2015-03-20 18:41:51
【问题描述】:

作为背景,我已经设置了 100 个红移查询,比这复杂得多,但我认为我一定遗漏了一些简单的东西。

我在表 1 和表 2 之间进行左外连接。这些表基本上是这样的:

Table1
Col1  Col2 Col3
A     C    E
A     D    F

Table2
Col 1 Col2 Col3
A     C    Z

我没有 where 语句。我的声明是:

on Table1.Col1 = Table2.Col1 and Table1.Col2 = Table2.Col2

我的结果表是:

ResultTable:
Col1 Col2 Col3 Col4
A    C    E    Z

我期待:

ExpectedTable:
Col1 Col2 Col3 Col4
A    C    E    Z
A    D    F    Null

我错过了什么?谢谢。

【问题讨论】:

  • 编辑您的问题并显示整个查询。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码加上所需的输出加上清晰的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)

标签: sql left-join amazon-redshift


【解决方案1】:

我认为您的查询中缺少 outer 关键字。这是一个左外连接的例子。

=> select * from Table1;
 col1 | col2 | col3
------+------+------
 A    | D    | F
 A    | C    | E
(2 rows)

=> select * from Table2;
 col1 | col2 | col4
------+------+------
 A    | C    | Z
(1 row)

=> select Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4 from Table1 left outer join Table2 on Table1.Col1 = Table2.Col1 and Table1.Col2 = Table2.Col2;
 col1 | col2 | col3 | col4
------+------+------+------
 A    | D    | F    |
 A    | C    | E    | Z
(2 rows)

【讨论】:

  • OUTER 关键字在左连接或右连接中是可选的。
【解决方案2】:

这可能不是您的问题,但如果连接中使用的任何列为空,则 Redshift 不会使用相等运算符匹配记录,即使连接两侧的列值为空也是如此。

要处理此问题,请为每个连接添加一个 or 条件,检查双方是否为空。

例如((a.col1 = b.col1) or (a.col1 is null and b.col1 is null))

【讨论】:

  • 这似乎没有很好的记录,但我看到了同样的问题——如果连接条件列包含 NULL 值,左外连接不一定会返回左侧表中的所有行。可以在每列周围添加一个 ISNULL() 来解决。
  • 很好的答案,奇怪的是 Redshift 本身并没有处理这个问题,但 NULL 行为似乎总是与其他值不同。
【解决方案3】:

似乎从今天开始,一切都按预期进行

WITH tst1 AS ( SELECT 'A' AS col1
                    , 'C' AS col2
                    , 'E' AS col3
            UNION ALL
               SELECT 'A' AS col1
                    , 'D' AS col2
                    , 'F' AS col3 )
                    
   , tst2 AS ( SELECT 'A'::VARCHAR AS col1
                    , 'C'::VARCHAR AS col2
                    , 'Z'::VARCHAR AS col3 )
                    
SELECT tst1.col1
     , tst1.col2
     , tst1.col3
     , tst2.col3 AS col4
FROM tst1
    LEFT JOIN tst2 ON tst1.col1 = tst2.col1
                  AND tst1.col2 = tst2.col2;
col1 col2 col3 col4
A C E Z
A D F

【讨论】:

    猜你喜欢
    • 2018-09-15
    • 2012-02-04
    • 2019-04-11
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2018-10-26
    相关资源
    最近更新 更多