首页 > 解决方案 > Redshift:错误:目标表必须是等值连接谓词的一部分

问题描述

首先,对于那些可能会说这是重复问题的人,我检查了这个更新语句:错误:目标表必须是等值连接谓词的一部分, 但这对我没有帮助,因为我的情况完全不同。

来到这个问题,

我正在尝试加入两个表并执行更新。这是我的查询:

UPDATE table1 SET f1 = table2.f1,f2 = table2.f2,f3 = table2.f3 FROM table2 where (table1.f1 = table2.f1 OR (table1.f1 is null and table2.f1 is null)) AND (table1.f2 = table2.f2 OR (table1.f2 is null and table2.f2 is null))

对于此查询,我收到错误:错误:目标表必须是等值连接谓词的一部分。

但是当我看到目标表已经在 equijoin 中使用时,为什么会出现这个错误?此外,我需要匹配源空值和目标空值,所以我使用了is null检查。如果我跳过它并执行如下正常的连接查询,它不会给出任何错误。

UPDATE table1 SET f1 = table2.f1,f2 = table2.f2,f3 = table2.f3 FROM table2 where table1.f1 = table2.f1 AND table1.f2 = table2.f2

那么第一个查询有什么问题呢?毕竟有额外的括号和条件,根据我的说法应该没有太大区别。

只是好奇,我在 redshift 中尝试了几个查询。

1. UPDATE table1 SET f1 = table2.f1,f2 = table2.f2,f3 = table2.f3 FROM table2 where (table1.f1 = table2.f1 OR (table1.f1 is null and table2.f1 is null)) -- Failed with same error.

2. UPDATE table1 SET f1 = table2.f1,f2 = table2.f2,f3 = table2.f3 FROM table2 where (table1.f1 = table2.f1 OR (table1.f1 is null and table2.f1 is null)) AND (table1.f2 = table2.f2) -- Passed

3. UPDATE table1 SET f1 = table2.f1,f2 = table2.f2,f3 = table2.f3 FROM table2 where (table1.f1 = table2.f1 OR (table1.f1 is null and table2.f1 is null)) OR (table1.f2 = table2.f2) -- Failed with same error

看起来它只有在最后一个条件为时才会失败,而OR在它是时才通过AND,非常非常非常令人惊讶。

标签: sqlamazon-redshift

解决方案


当您只=评估运算符并且如果有多个条件它只能是一个交集(您只能使用AND,而不是OR)时,严格来说等值连接谓词。我不确切知道为什么以这种方式实现它,但我认为它背后有很好的理由与并行化相关。更复杂的逻辑需要通过子查询实现。

第一个查询不符合这些要求。解决方案是相同的——任何时候你想做比等值连接更复杂的事情,你可以将更复杂的连接包装到一个子查询中,然后将其等值连接到更新的表中。


推荐阅读