在单个语句中同时使用 UPDATE 和 JOIN

Posted

技术标签:

【中文标题】在单个语句中同时使用 UPDATE 和 JOIN【英文标题】:Using an UPDATE and JOIN together in a single statement 【发布时间】:2015-01-15 23:02:39 【问题描述】:

我在写的这个声明中不断出现错误,想知道是否有人可以提供帮助。我有两张桌子。表 A 和表 B。当两个 ID 匹配时,我想用表 B 中的值更新表 A。

目前我的代码如下:

UPDATE [Table A]

SET [Table A].[Column 1]='value', [Table A].[Column 2]='value2', [Table A].[Column 3]='value3'

INNER JOIN [Table B]

ON [Table A].[Column 1] = [Table B].[Column 1] AND [Table B].[Column 2];

但我不断返回我无法识别的语法错误。

【问题讨论】:

我们也无法识别它,因为您没有包含错误! [Table A].[Table 3]='value3' 应该是什么意思? 在你的 WHERE 子句中,[Table B].[Column 2] 之后应该有 sth 究竟是什么? 检查this answer 是否有非常相似的问题。 @sqluser 的意思是你也错过了 [Table B].[Column 2]- 的比较,除非它是一个布尔列。 【参考方案1】:

您在INNER JOIN 之前缺少FROM 子句。加入在SELECTUPDATEDELETE 上的工作方式相同。试试这样:

UPDATE [Table A]
SET [Table A].[Column 1]='value', [Table A].[Column 2]='value2', [Table A].[Column 3]='value3'
FROM [Table A]
INNER JOIN [Table B]
ON [Table A].[Column 1] = [Table B].[Column 1] AND [Table B].[Column 2];

(未经测试,但它应该可以完成这项工作)

【讨论】:

我也尝试过此操作,但在查询表达式中收到语法错误(缺少运算符)。它在我的 SET 语句的结尾和我的 FROM 语句的开头之间声明。 对不起,我在想 T-Sql。访问语法似乎有所不同。【参考方案2】:

这会将值从源表 (S) 更新到目标表 (T)

UPDATE T
SET T.COLUMNA = S.COLUMNA, T.COLUMNB = S.COLUMNB
FROM TARGET T
INNER JOIN SOURCE S ON T.IDCOLUMN = S.IDCOLUMN
WHERE
 S.FILTERCOLUMN = 'FILTERVALUE'

但是,如果您的场景需要,您可能需要考虑使用合并语句

MERGE TARGETTABLE T
USING SOURCETABLE S
    ON S.IDCOLUMN = T.IDCOLUMN
WHEN MATCHED THEN
    UPDATE SET COLUMNA = S.COLUMNA, COLUMNB = S.COLUMNB
WHEN NOT MATCHED BY TARGET
    THEN INSERT(COLUMNA, COLUMNB) VALUES (S.COLUMNA, S.COLUMNB)
WHEN NOT MATCHED BY SOURCE
    THEN DELETE;

【讨论】:

我通常会使用合并语句,但遗憾的是 T-SQL 在访问中没有我希望的那样工作哈哈,但感谢您的建议!

以上是关于在单个语句中同时使用 UPDATE 和 JOIN的主要内容,如果未能解决你的问题,请参考以下文章

MySQL45讲join语句优化

如何在SQL中使用JOIN执行UPDATE语句?

mysql update 的时候使用left join和where语句

mysql update 的时候使用left join和where语句

Mysql的join语句

Redshift 中的 update + case + join 语句