How to solve ERROR: Target table must be part of an equijoin predicate in Redshift?

How to solve ERROR: Target table must be part of an equijoin predicate in Redshift?

我想根据特定条件用另一个红移 table (table2) 的列更新红移 table (table1) 的两列。当 运行 以下查询时,我收到等值连接谓词错误。

UPDATE schema1.table1
SET col1 = sub.col3,
col2 = sub.col4
FROM (
SELECT a.col1, a.col2, b.col3, b.col4 FROM schema1.table1 a LEFT JOIN schema2.table2 b 
ON ((a.col5 > b.col6) AND (a.col5 < b.col7))
)sub;

所以问题是 Redshift 无法确定您要更新哪一行。应该有一个 WHERE 子句指示 from-select 的结果如何与正在更新的 table 相匹配。

这是 Redshift 文档中的示例:

update category set catid=100
from (select event.catid from event left join category cat on event.catid=cat.catid) eventcat
where category.catid=eventcat.catid
  and catgroup='Concerts';

即使在“from-select”中引用了 table“类别”,Redshift 也需要 WHERE 子句来对齐结果。另请注意,“from-select”中对“类别”的引用需要使用别名以避免混淆。

现在让我们看看您的查询(格式化):

UPDATE schema1.table1 SET col1 = sub.col3, col2 = sub.col4
FROM (SELECT a.col1, a.col2, b.col3, b.col4
    FROM schema1.table1 a
    LEFT JOIN schema2.table2 b
    ON ( ( a.col5 > b.col6 ) AND ( a.col5 < b.col7 ) ))sub;

您需要一个 WHERE 子句来让 Redshift 知道在哪里应用“from-select”的每一行。这可以像

一样简单
WHERE table1.col1 = sub.col1 AND table1.col2 = sub.col2

但由于我不知道你的数据模型,所以这可能完全关闭。

这里还有一个危险,就是使用不等式连接生成FROM结果可能会导致大量的行和重复更新。