【问题标题】:Update on INNER JOIN not workingINNER JOIN 更新不起作用
【发布时间】:2018-01-10 19:28:57
【问题描述】:

我正在尝试使用内部联接从另一个表更新 Redshift 中的一个表。

查询:

UPDATE target 
INNER JOIN updates ON target.name = updates.name and target.title = updates.title and target.age = updates.age 
  SET target.num_hit_ratio = updates.num_hit_ratio, target.plan_id = updates.plan_id;

这是报错:

“INNER”处或附近的语法错误

我在哪里犯错了?

【问题讨论】:

  • 这是一个基于 postgres 的红移查询
  • 更新语句中没有inner join。详情见the manual
  • 您可能正在寻找“更新自”语法。从源 x 更新目标集 target.x=xyz.x where target.id=x.target_id etc.
  • 如上所述,这在文档中有介绍。例如。 UPDATE target SET ... FROM updates WHERE target.name = updates.name and target.title = updates.title and target.age = updates.age
  • 是的。 UPDATE 不支持 INNER Join。谢谢它的工作

标签: sql sql-update inner-join amazon-redshift


【解决方案1】:

正如 Redshift documentation 中所述,UPDATE 可以连接到其他表以在 SET 命令中生成值,但连接语法采用 WHERE 子句谓词的形式(不是显式的 JOIN 语法)。

UPDATE target
  SET target.num_hit_ratio = updates.num_hit_ratio,
      target.plan_id = updates.plan_id
FROM updates 
WHERE target.name = updates.name 
AND target.title = updates.title 
AND target.age = updates.age

注意这个替代的 WHERE 子句语法,删除 AND 关键字并将条件括在括号中:

...
WHERE
  (target.name, target.title, target.age)
  =
  (updates.name, updates.title, updates.age)

【讨论】:

    【解决方案2】:

    您也可以使用别名,这样您的连接就更多了 可读:

    UPDATE t
    SET ...
    FROM target t 
    INNER JOIN updates u ON t.name = u.name AND t.title = u.title AND t.age = u.age
    

    【讨论】:

      【解决方案3】:

      使用您的查询,您只需要重新排列如下几件事:

      UPDATE
          target
      SET
          target.num_hit_ratio = updates.num_hit_ratio, target.plan_id = updates.plan_id
      FROM
          target
          JOIN updates ON target.name = updates.name AND target.title = updates.title AND target.age = updates.age
      

      我个人会给你的表格一个别名,以便更容易输入(因为我很懒:P):

      UPDATE
          T
      SET
          num_hit_ratio = U.num_hit_ratio,
          plan_id = U.plan_id
      FROM
          target T
          JOIN updates U ON T.name = U.name AND T.title = U.title AND T.age = U.age
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-30
        • 2015-03-10
        • 1970-01-01
        • 2015-11-02
        相关资源
        最近更新 更多