update语句:[amazon](500310)操作无效:目标表必须是equijoin predicate 的一部分;

alen0pnh  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(346)

如果在update语句中使用or运算符,则得到的错误目标表必须是equijoin predicate 的一部分。我也尝试了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 update语句中有什么替代方法?

vltsax25

vltsax251#

这是一个红移限制-基本上它只接受更新的连接条件中的相等条件的交集 OR 运营商未能满足交叉部分,以及 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';
kyxcudwk

kyxcudwk2#

如果您限定列引用,它是否有效?

UPDATE db.table1 
    SET col1 = table2.col1, 
        col2 = table2.col2 
    FROM table2 
    WHERE table1.col3 IN ( table2.col3, table2.col4 ) AND
          ?.col5 = 'some string';

这个 ? 因为我不知道那是哪张table。

6ss1mwsb

6ss1mwsb3#

我的同事给了我另一个选择,谢谢

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';

相关问题