INNER JOIN 更新不起作用

Posted

技术标签:

【中文标题】INNER JOIN 更新不起作用【英文标题】:Update on INNER JOIN not working 【发布时间】: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。谢谢它的工作 【参考方案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

【讨论】:

以上是关于INNER JOIN 更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

INNER JOIN 条件不起作用

表值函数的 INNER JOIN 不起作用

为啥这个使用 INNER JOIN 的 SQL DELETE 查询不起作用? [复制]

ORACLE SQL UPDATE 与 INNER JOIN 不起作用

为啥 os.path.join() 在这种情况下不起作用?

socket.join 不起作用(socket.io)