我有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看起来像:
问题是你不能在红移中用等号检查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。只有这样,它才会是一个无行结果。