Snowflake Join 不返回空值条件匹配来自 2 个表的记录

问题描述 投票:0回答:1

我有一个头表和一个事务表。 标头表的 Id 值为 Null,描述有一些内容,而事务表的 Id 值为 null,用于描述一些内容。

现在,当我加入

Header.Id = Transaction.Id
时,我应该让 Id 具有匹配值以及空值,因为 id 与事务表中的空值匹配。

就像下面的查询:

SELECT 
    SH.HEADER_COLID,
    SH.HEADER_COLDESCRIPTION,
    S.SALEORDER_MONTH,
    S.SALEORDER_YEAR,
    SUM(S.SALEORDER_AMT),
    SUM(S.SALEORDER_QTYCASES),
    SUM(S.SALEORDER_QTYWGHTPNDS)
FROM SDS_HEADERS SH,  SALEORDERS S  
WHERE SH.HEADER_COLID = S.DIVISION  
    AND SH.COLUMN_ID =1  
    AND S.OPEN_CLOSE='false' 
    AND S.SALEORDER_YEAR='2021'
GROUP BY SH.HEADER_COLID, SH.HEADER_COLDESCRIPTION, 
    S.SALEORDER_MONTH, S.SALEORDER_YEAR
ORDER BY SH.HEADER_COLID, SH.HEADER_COLDESCRIPTION, 
    S.SALEORDER_MONTH, S.SALEORDER_YEAR ASC

我得到了

SH.HEADER_COLID  = S.DIVISION
的匹配记录,但 HEADER_COLID 的空值应该与 DIVISION 空值匹配,但我没有得到这些记录。我需要它们,请帮助了解如何在雪花中实现这一目标。

join null snowflake-cloud-data-platform matching
1个回答
4
投票

现在,当我加入 Header.Id=Transaction.Id 时,我应该让 Id 具有匹配值以及空值,因为 id 与事务表中的空值匹配。

要将

NULL=NULL
视为 true,可以使用 NULL 安全运算符

ON Header.Id IS NOT DISTINCT FROM Transaction.Id

样品:

CREATE TABLE t1 AS
SELECT 1 AS id, 'a' AS c UNION
SELECT 2, 'b'            UNION
SELECT NULL, 'c';

CREATE TABLE t2 AS
SELECT 2 AS id UNION
SELECT 3       UNION 
SELECT NULL;

查询:

SELECT *
FROM T1
JOIN T2
  ON T1.ID = T2.ID;
-- id   c   id
-- 2    b   2

SELECT *
FROM T1
JOIN T2
  ON T1.ID IS NOT DISTINCT FROM T2.ID;
-- id   c   id
-- 2    b   2
-- NULL  c  NULL

db<>小提琴演示

编辑:

可以采用不同的方法:

  1. col1 与 col2 不同
  2. ON(col1 = col2 或 col1 为 NULL 并且 col2 为 NULL)
  3. ON EQUAL_NULL(col1, col2)

具体版本的使用取决于品味/惯例。

IS DISTINCT FROM
起初可能看起来很深奥,但它是在 SQL 标准中定义的。相关:卢卡斯·埃德尔的 IS DISTINCT FROM 谓词

第二种方法的意图非常明确,并且在多个 RDBMS 之间兼容,但并不简洁。 第三种方法是使用特定于产品的函数 EQUAL_NULL。

© www.soinside.com 2019 - 2024. All rights reserved.