Redshift左外连接省略了空值

时间:2015-01-22 03:38:43

标签: sql left-join amazon-redshift

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

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

Table1
Col1  Col2 Col3
A     C    E
A     D    F

Table2
Col 1 Col2 Col3
A     C    Z

我没有任何陈述。我的声明是:

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

我错过了什么?感谢。

3 个答案:

答案 0 :(得分:6)

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

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

e.g。 ((a.col1 = b.col1) or (a.col1 is null and b.col1 is null))

答案 1 :(得分:0)

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

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

答案 2 :(得分:-2)

我认为您的查询中缺少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)