我有一个 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
编辑:
可以采用不同的方法:
- col1 与 col2 没有区别
- ON(col1 = col2 或 col1 为 NULL 并且 col2 为 NULL)
- 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/