INNER JOIN上的更新无效

时间:2018-01-10 19:28:58

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

我正在尝试使用内部联接从另一个表更新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”或其附近的

语法错误

我在哪里弄错了?

3 个答案:

答案 0 :(得分:3)

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

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)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

使用您的查询,您只需重新排列以下内容:

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