我正在尝试使用子查询更新MS SQL语句中的多个列。搜索引发了我的注意:
UPDATE table1
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 FROM
(SELECT col1, col2, col3 from table2 where <expression>) AS a
WHERE table1.col1 <expression>
http://geekswithblogs.net/phoenix/archive/2009/10/13/update-multiple-columns-on-sql-server.aspx
我的问题是在内部WHERE
表达式中我需要引用table1中的特定字段:
UPDATE table1
SET col1 = a.col1, col2 = a.col2, col3 = a.col3 FROM
(SELECT col1, col2, col3 from table2 where table1.col0 = table2.col0) AS a
WHERE table1.col1 <expression>
当我运行该查询时,我得到“多部分标识符”table1.col0“无法绑定。 “。显然,当使用该语法时,SQL无法绑定子查询中的当前table1记录。现在我正在为每个字段重复子查询并使用语法:
UPDATE table1
SET col1 = (subquery), col2 = (subquery)...
但是每列执行一次子查询(非常昂贵),我想避免这种情况。
有什么想法吗?
答案 0 :(得分:10)
在sql server中,您可以在更新查询中使用from
子句。像在select中一样加入表格。您要更新的表必须包含在连接中。
update table_1
set field_1 = table_2.value_1
from table_1
inner join table_2
on (table_1.id = table_2.id)
答案 1 :(得分:2)
您的汽车使用CROSS APPLY命令更新子选择
中的多个列UPDATE t1
SET t1.col1 = a.col1, t1.col2 = a.col2, t1.col3 = a.col3
FROM table1 t1
CROSS APPLY
(SELECT col1, col2, col3 from table2 where table1.col0 = table2.col0) a(col1,col2,col3)
答案 2 :(得分:1)
或者如果您不喜欢连接语法,这也可以起作用:
UPDATE table1
SET col1 = a.col1, col2 = a.col2, col3 = a.col3
FROM table1, table2 as a
WHERE table1.col0 = a.col0
AND table1.col1 <expression>