如何从 SQL Server 中的 SELECT 更新?

问题描述:

在 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开始!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值