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

标签 join null snowflake-cloud-data-platform matching

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

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

就像下面的查询:

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 的 Null 值应与 DIVISION null 值匹配,但我没有获得这些记录。我需要它们,请帮助了解如何在雪花中实现这一目标。

最佳答案

Now when I join on Header.Id=Transaction.Id I should have Id having matching values as well as null value as id matching with null value in transaction table.

要将 NULL=NULL 视为 true,NULL safe operator可以使用:

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<>fiddle demo

编辑:

可以采用不同的方法:

  1. col1 与 col2 没有区别
  2. ON(col1 = col2 或 col1 为 NULL 并且 col2 为 NULL)
  3. ON EQUAL_NULL(col1, col2)

具体版本的使用取决于品味/惯例。 IS DISTICT FROM 乍一看似乎很深奥,但它是在 SQL 标准中定义的。相关:The IS DISTINCT FROM predicate by Lukas Eder .

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

关于join - Snowflake Join不返回空值条件匹配来自2个表的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70295189/

相关文章:

sql - mySql join - 来自同一张表的多条记录

mysql - 从多个表中获取带时间戳的计数

MySQL 添加新列到查询结果

sql - 为什么 PostgreSQL COPY 命令不允许数组中存在 NULL 值?

sql - 在 Snowflake 的公用表表达式中使用 "match_recognize"

sql - Rails 中具有多个连接的高级查询

ruby-on-rails - 为新客户记录创建操作时提交的空记录

filter - 如何过滤给定列的行(不为null)?

snowflake-cloud-data-platform - Snowflake 将参数传递给多个存储过程

snowflake-cloud-data-platform - Snowflake 中的数据加载 : NULL result in a non-nullable column