sql - 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
,非常非常非常令人惊讶。
解决方案
当您只=
评估运算符并且如果有多个条件它只能是一个交集(您只能使用AND
,而不是OR
)时,严格来说等值连接谓词。我不确切知道为什么以这种方式实现它,但我认为它背后有很好的理由与并行化相关。更复杂的逻辑需要通过子查询实现。
第一个查询不符合这些要求。解决方案是相同的——任何时候你想做比等值连接更复杂的事情,你可以将更复杂的连接包装到一个子查询中,然后将其等值连接到更新的表中。
推荐阅读
- google-sheets - 具有取决于 countif 的过滤器和索引值的数组公式
- r - 我如何计算每行组内的观察值?
- java - fxml 的 javafx getResources 始终返回 null
- ruby-on-rails - 如何查询Notified gem json 字段
- reactjs - net::ERR_ABORTED 401(未经授权)。如何解决此反应错误?
- python - 当通过板读取串行数据时,在 SPYDER 中看不到实时更新图,它只显示错误“
- spring-boot - 通过 java -jar 命令运行时 Spring 注释不起作用
- python - 带有自定义内核的 GridSearchCV
- python - AttributeError: 'bool' 对象没有属性 'append'
- sql - 强制执行约束的触发器:确保 2 个 Npc_id 不能具有相同的 item_id