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 的 SQL DELETE 查询不起作用? [复制]