问题描述:
在 SQL Server 中,可以使用 INSERT… SELECT 语句将行插入到表中:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
是否也可以更新带有 SELECT 的表?我有一个包含这些值的临时表,并想使用这些值更新另一个表。也许是这样的:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
解决方案1:
保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com
UPDATE
Table_A
SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2
FROM
Some_Table AS Table_A
INNER JOIN Other_Table AS Table_B
ON Table_A.id = Table_B.id
WHERE
Table_A.col3 = 'cool'
如果您正在编辑表之间的链接 (SET Table.other_table_id = @NewValue),请将 ON 语句更改为 ON Table.id = @IdToEdit AND other_table.id = @NewValue
@CharlesWood 是的。我在 MySQL 中有同样的问题。如果有人知道如何将它实现到 MySQL 并与大家分享,那就太好了。相信很多人都在寻找 MySQL 版本的解决方案
如何在集合中使用别名?更新表集合 a.col1 = b.col2 从表 a 内连接 table2 b on a.id = b.id;相反,我必须使用 update table set table.col1 = b.col2 from table a inner join table2 b on a.id = b.id;
有点相关,我经常喜欢先将我的 UPDATE 查询写成 SELECT 语句,这样我就可以在执行之前看到将要更新的数据。 Sebastian 在最近的一篇博文中介绍了一种技术:sqlity.net/en/2867/update-from-select
您不能执行 SET Table_A.col1 = SUM(Table_B.col1) 或任何其他聚合。 Jamal 的回答允许您将聚合放在 SELECT stackoverflow.com/a/8963158/695671
解决方案2:
huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式
在 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;
MERGE 也可用于“Upserting”记录;也就是说,UPDATE 如果匹配记录存在,INSERT 新记录如果没有找到匹配
对我来说,这比等效的 update...join 语句快了大约 10 倍。
MERGE 也可以用来删除。但要小心 MERGE,因为 TARGET 表不能是远程表。
合并错误:mssqltips.com/sqlservertip/3074/…
@SimonD:选择任何 SQL Server 关键字,您都会发现错误。你的观点?我敢打赌,与 UPDATE 相关的错误(以及更基本的错误)比 MERGE 更多,人们刚刚学会与他们相处,他们成为景观的一部分(“功能”)。考虑到当 UPDATE 是新来的孩子时,博客还不存在。
解决方案3:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
UPDATE YourTable
SET Col1 = OtherTable.Col1,
Col2 = OtherTable.Col2
FROM (
SELECT ID, Col1, Col2
FROM other_table) AS OtherTable
WHERE
OtherTable.ID = YourTable.ID
这往往适用于几乎所有 DBMS,这意味着一次学习,到处执行。如果这对您来说比性能更重要,您可能更喜欢这个答案,特别是如果您的更新是为了更正某些数据而一次性完成的。
如果您需要使用第二个表的聚合设置第一个表,您可以将聚合放在 select 子查询中,因为您不能执行 SET Table_A.col1 = SUM(Table_B.col1)(或任何其他聚合函数)。为此目的,比罗宾戴的答案要好。
我真的很喜欢这个解决方案,因为它感觉像是对 INSERT ... SELECT 工作方式的自然赞美。感谢分享!
解决方案4:
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
我会将 Robin’s excellent answer 修改为以下内容:
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 子句,您甚至会影响不需要影响的行,这可能(可能)导致索引重新计算或触发真正不应该触发的触发器。
这假设没有任何列可以为空。
你是对的,我是手动输入示例的。我在 where 语句中添加了第三个和第四个子句来处理这个问题。
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2)) 更简洁。
语句不应该在 where 子句中也包含这两个吗? (other_table.col1 为空且 table.col1 不为空)或(other_table.col2 为空且 table.col2 不为空)
取决于您是否想用源中的空值替换目标中的空值。很多时候,我不会。但是如果你这样做了,Martin 对 where 子句的构造是最好的使用方法。
解决方案5:
huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。
单程
UPDATE t
SET t.col1 = o.col1,
t.col2 = o.col2
FROM
other_table o
JOIN
t ON t.id = o.id
WHERE
o.sql = 'cool'
解决方案6:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
尚未提及的另一种可能性是将 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 中使用哪个可能的匹配连接记录(如果存在,MERGE 通过引发错误来避免这个问题)是尝试多次更新同一行)。
CTE 这个名字有什么含义吗?
@ShivanRaptor - 它是 Common Table Expression 的首字母缩写。在这种情况下只是一个任意别名。
这也适用于多个 CTE:;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
解决方案7:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
作为记录(以及其他像我一样搜索的人),您可以在 MySQL 中这样做:
UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id
解决方案8:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
使用别名:
UPDATE t
SET t.col1 = o.col1
FROM table1 AS t
INNER JOIN
table2 AS o
ON t.id = o.id
解决方案9:
一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会
简单的方法是:
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
这不是 SQl Server 语法,它在 SQL Server 中不起作用
解决方案10:
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求
这可能是执行更新的一个利基原因(例如,主要用于过程中),或者对其他人来说可能很明显,但也应该说明您可以在不使用连接的情况下执行更新选择语句(如果您正在更新的表没有公共字段)。
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
我觉得这应该是公认的答案,因为它使事情变得简单明了。
解决方案11:
huntsbot.com – 高效赚钱,自由工作
这是另一个有用的语法:
UPDATE suppliers
SET supplier_name = (SELECT customers.name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id)
WHERE EXISTS (SELECT customers.name
FROM customers
WHERE customers.customer_id = suppliers.supplier_id);
它通过使用“WHERE EXIST”检查它是否为空。
唯一对我有用的答案。我正在使用 MariaDB,我的查询格式为:SELECT value FROM table_1 INNER JOIN ( SELECT * FROM table_2 WHERE ..... ) ON ( ...... )
原文链接:https://www.huntsbot.com/qa/jW7l/how-do-i-update-from-a-select-in-sql-server?lang=zh_CN
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!