为什么左OUTER JOIN产生相同的结果作为INNER JOIN在DBEAVER时从红移查询? &g



我有2个表。t1.uuid有63万个不同的值。t2.uuid有30万个不同的值。

运行

SELECT 
t1.uuid
, t2.uuid
FROM 
t1 --630,000 uuids
LEFT OUTER JOIN t2 -- 300,000 uuids
ON t1.uuid = t2.uuid 
WHERE
t2.uuid IS NULL

没有结果。

Edit1:澄清:T1看起来像:

<表类>uuidtbody><<tr>ufo123abc456def789

问题是你不能在红移中用等号检查NULL。NULL = NULL"是假的。

你需要扩展你的JOIN ON子句(我把它留在一般情况下,你不需要WHERE子句):

SELECT 
t1.uuid
, t2.uuid
FROM 
t1 --630,000 uuids
LEFT OUTER JOIN t2 -- 300,000 uuids
ON (t1.uuid = t2.uuid) OR (t1.uuid IS NULL AND t2.uuid IS NULL)
WHERE
t2.uuid IS NULL

问题是,当t1和t2都有NULL uid时,这些都将相互连接,并可能爆炸你的结果。所以如果有很多null,你可能想用另一种方式来检查。

至于解释,让我来解释一下"为什么"。这一点。这与Redshift从SQL中推断WHERE子句有关。它是这样的,如果是t2。uuid = X和t1。Uuid = t2。那么红移应该能够应用WHERE子句t1。uuid = x,但这会产生空集,原因如上所述。红移这样做是为了尽可能地减少扫描数据。

更新:

请注意,您正在用这个LEFT OUTER JOIN重新创建EXCEPT子句。使用EXCEPT可能会得到更好的结果。

你的逻辑看起来很好。对样本数据进行测试。table a有3条记录,table b有1条记录。输出2条不匹配的记录

WITH t1 AS (SELECT 1 AS col UNION SELECT 2 UNION SELECT 3)
, t2 AS (SELECT 1 AS col)
SELECT *
FROM t1
LEFT JOIN t2 ON t1.col = t2.col
where t2.col is null

输出
+------+-------+
|t1.col|t2.col |
+------+-------+
|2     |NULL   |
|3     |NULL   |
+------+-------+

我建议检查它匹配的数据。正如Pelayo Martinez提到的,你的左表很可能是T2而不是T1。只有这样,它才会是一个无行结果。

最新更新