Sql 红移左外联接将忽略空值

Sql 红移左外联接将忽略空值,sql,left-join,amazon-redshift,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 我没有where语句。我的声明如下: on Table1.Col1 = Table2.Col1 and Table1.Col2 = Table2.Col2 我的结果表是: R

作为背景,我已经设置了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

我错过了什么?谢谢。

我认为您的查询中缺少
外部
关键字。下面是一个左外联接的示例

=> 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)

这可能不是您的问题,但是如果联接中使用的任何列为null,即使联接两侧的列值都为null,红移也不会使用相等运算符匹配记录

若要处理此问题,请为每个连接添加or条件,检查两侧是否为null


e、 g.
((a.col1=b.col1)或(a.col1为空,b.col1为空))

似乎到今天为止,一切都按预期运行

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;
可乐 可乐 可乐 可乐 A. C E Z A. D F
编辑您的问题并显示整个查询。请在代码问题中给出一个--cut&paste&runnable代码加上所需的输出,再加上清晰的说明和解释。这包括您能给出的最少代码,即您显示为OK的代码,由您显示为not OK的代码扩展。(调试基础。)OUTER关键字在left或right联接中是可选的。这似乎没有很好的文档记录,但我看到了相同的问题-如果联接条件列包含空值,则left-OUTER联接不一定返回左侧表中的所有行。可以通过在每个列周围添加一个ISNULL()来解决。答案很好,奇怪的是红移从本质上不能处理这个问题,但是NULL行为的工作方式似乎总是与其他值不同。