sql - SQL Server UPDATE 从 SELECT 中获取数据

  显示原文与译文双语对照的内容

在 SQL Server 中,可以使用SELECT语句在表中插入:


INSERT INTO Table (col, col2, col3)
 SELECT col, col2, col3 FROM other_table WHERE sql = 'cool'

是否也可以通过选择更新? 我有一个包含这些值的临时表,并且希望使用这些值更新另一个表。 可能类似这样:


UPDATE Table SET col1, col2
 SELECT col1, col2 FROM other_table WHERE sql = 'cool'
 WHERE Table.id = other_table.id

时间:

在 SQL Server 2008 ( 或者更好或者更好) 中,使用 MERGE


MERGE INTO YourTable T
 USING other_table S 
 ON T.id = S.id
 AND S.tsql = 'cool'
WHEN MATCHED THEN
 UPDATE 
 SET col1 = S.col1, 
 col2 = S.col2;

或者:


MERGE INTO YourTable T
 USING (
 SELECT id, col1, col2 
 FROM other_table 
 WHERE tsql = 'cool'
 ) S
 ON T.id = S.id
WHEN MATCHED THEN
 UPDATE 
 SET col1 = S.col1, 
 col2 = S.col2;

我将修改robin的优秀答案:


UPDATE
 Table 
SET
 Table.col1 = other_table.col1,
 Table.col2 = other_table.col2 
FROM
 Table 
INNER JOIN 
 other_table 
ON 
 Table.id = other_table.id 
WHERE
 Table.col1!= other_table.col1 or 
 Table.col2!= other_table.col2 or
 (other_table.col1 is not null and table.col1 is null) or
 (other_table.col2 is not null and table.col2 is null)

如果没有where子句,你将影响甚至不需要影响的行,这可能导致索引重新计算或者激发不应该被激发的激发触发器。

还没有提到的另一个可能是把 SELECT 语句本身放到一个CTE中,然后更新 CTE 。


;WITH CTE
 AS (SELECT T1.Col1,
 T2.Col1 AS _Col1,
 T1.Col2,
 T2.Col2 AS _Col2
 FROM T1
 JOIN T2
 ON T1.id = T2.id
/*Where clause added to exclude rows that are the same in both tables
 Handles NULL values correctly*/
 WHERE EXISTS(SELECT T1.Col1,
 T1.Col2
 EXCEPT
 SELECT T2.Col1,
 T2.Col2))
UPDATE CTE
SET Col1 = _Col1,
 Col2 = _Col2 

这有好处,它是很容易运行 SELECT 语句自己的健全检查结果,但是它要求你在源和目标表中以相同的方式对列进行别名。

这也有相同的限制,因为它的UPDATE.. . FROM 语法在其他四个答案中显示。 在 Update 上如果源表很多种液晶层的一对多联接的可能的匹配联接记录将过去通用的那么它是undeterministic哪个

对于记录( 还有其他人像我一样搜索),你可以在MySQL中这样做:


UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id

这可能是执行更新( 例如主要用于一个过程)的一个很好的理由,或者对其他人很明显,但是也应该声明你可以执行update-select语句而不使用 join ( 如果你正在更新的表没有公共字段) 。


update
 Table
set
 Table.example = a.value
from
 TableExample a
where
 Table.field = *key value* -- finds the row in Table 
 AND a.field = *key value* -- finds the row in TableExample a

示例方法是:


UPDATE
 table_to_update,
 table_info
SET
 table_to_update.col1 = table_info.col1,
 table_to_update.col2 = table_info.col2

WHERE
 table_to_update.ID = table_info.ID

...