更新声明:[Amazon](500310) 无效操作:目标表必须是等值连接谓词的一部分;
Posted
技术标签:
【中文标题】更新声明:[Amazon](500310) 无效操作:目标表必须是等值连接谓词的一部分;【英文标题】:UPDATE STATEMENT :[Amazon](500310) Invalid operation: Target table must be part of an equijoin predicate; 【发布时间】:2020-06-04 22:02:26 【问题描述】:我收到此错误目标表必须是等值连接谓词的一部分 如果我在更新语句中使用 OR 运算符。我也尝试了 IN 运算符但得到相同的错误,
我原来的更新查询是
UPDATE db.table1
SET col1 = table2.col1,
col2 = table2.col2
FROM table2
WHERE ( col3 = table2.col3
OR col3 = table2.col4 )
AND col5 = 'some string';
我尝试使用 IN 运算符但得到同样的错误
UPDATE db.table1
SET col1 = table2.col1,
col2 = table2.col2
FROM table2
WHERE col3 IN ( table2.col3, table2.col4 )
AND col5 = 'some string';
Redshift 更新语句中 OR 的替代方案是什么?
【问题讨论】:
【参考方案1】:这是一个 Redshift 限制 - 基本上它只接受更新的连接条件中的相等条件的交集(OR
运算符无法满足 intersection 部分,而 IN
赢了不要欺骗数据库)。
对于这个查询,我认为将它分成两个语句可能更简单——这样效率较低,但至少是可能的:
UPDATE db.table1
SET col1 = table2.col1,
col2 = table2.col2
FROM table2
WHERE col3 = table2.col3
AND col5 = 'some string';
UPDATE db.table1
SET col1 = table2.col1,
col2 = table2.col2
FROM table2
WHERE col3 = table2.col4
AND col5 = 'some string';
【讨论】:
【参考方案2】:如果您限定列引用,它是否有效?
UPDATE db.table1
SET col1 = table2.col1,
col2 = table2.col2
FROM table2
WHERE table1.col3 IN ( table2.col3, table2.col4 ) AND
?.col5 = 'some string';
?
是因为我不知道来自哪个表。
【讨论】:
?是目标表 table1 像 table1.col5 = 'some string';但它仍然无法正常工作。谢谢【参考方案3】:我从同事那里得到了另一个选择,谢谢@Swarup
UPDATE db.table1
SET col1 = res.col1,
col2 = res.col2
FROM (
SELECT table2.col1,
table2.col2,
table2.col3 AS col_common
FROM table2
UNION ALL
SELECT table2.col1,
table2.col2,
table2.col4 AS col_common
FROM table2 )res
WHERE table1.col3=res.col_common AND table1.col5 = 'some string';
【讨论】:
以上是关于更新声明:[Amazon](500310) 无效操作:目标表必须是等值连接谓词的一部分;的主要内容,如果未能解决你的问题,请参考以下文章
[Amazon](500310) 无效操作:函数弧度(文本)不存在
AMAZON 500310:无效操作:“Drop”处或附近的语法错误
SQL 错误 [500310] [42703]: [Amazon](500310) 无效操作:events_20180626_temp 中不存在列“engagement_time_msec”;
[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;