Using Left Outer Join in Redshift Update Query result in ERROR: Target table must be part of an equijoin predicate

Using Left Outer Join in Redshift Update Query result in ERROR: Target table must be part of an equijoin predicate

我有这个查询,运行它导致了错误

SQL Error [XX000]: ERROR:
Target table must be part of an equijoin predicate
UPDATE sandbox.f_contribution
SET lpct = NVL(l.percentage, 0)
FROM sandbox.f_contribution AS f
LEFT OUTER JOIN sandbox.f_contribution_last AS l
    ON f.year = l.year AND f.location = l.location AND f.category = l.category
    WHERE f.year = 2020;

docs 表示不支持 LEFT OUTER JOIN,它建议“使用一个子查询,将连接条件与更新行的条件明确分开”,所以我尝试将查询修改为这样的 但同样的错误仍然存​​在:

UPDATE sandbox.f_contribution
SET lpct = NVL(c.percentage, 0)
FROM (
select l.percentage
from sandbox.f_contribution AS f
LEFT OUTER JOIN sandbox.f_contribution_last AS l
    ON f.year = l.year AND f.location = l.location AND f.category = l.category
    ) c WHERE f_contribution.year = 2020;

我应该如何在 Redshift 中将相同的查询修改为 运行?

您已阅读第一个 SQL 中的问题所在。您的第二个缺少执行更新所需的信息,特别是在 WHERE 子句中。

您的子查询生成一组行,其中一列名为百分比。您的目标 table 有一个名为 lpct 的列,该列被设置为来自子查询的值(如果为 NULL,则为零),但是哪个子查询值? UPDATE 如何将这些值应用到目标?

我怀疑您需要 WHERE 子句进行一些对齐测试来消除这种混淆。 WHERE 子句基本上是如何将 FROM 子句中的数据与子查询中的数据连接起来。

猜测您的意图是有风险的,但您可能打算这样做:

UPDATE sandbox.f_contribution
SET    lpct = Nvl(c.percentage, 0)
FROM   sandbox.f_contribution_last AS c
WHERE  f_contribution.year = c.year
       AND f_contribution.location = c.location
       AND f_contribution.category = c.category
       AND f_contribution.year = 2020;