更新声明:[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查询;

Redshift 存储过程 - [Amazon](500310) 无效操作:“$1”处或附近的语法错误;

如何通过手动查询重现:[Amazon](500310) 无效操作:找不到从“未知”到整数的转换函数;