如何从 SQL Server 中的 SELECT 进行 UPDATE 操作?

How do I UPDATE from a SELECT in SQL Server?

提问人:jamesmhaley 提问时间:2/25/2010 最后编辑:Jatin Morarjamesmhaley 更新时间:9/29/2023 访问量:5235237

问:

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
sql sql-server t-sql sql-update dml

评论


答:

5983赞 Robin Day 2/25/2010 #1
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'

评论

26赞 Trisped 10/25/2012
如果要编辑表()之间的链接,则将ON语句更改为类似SET Table.other_table_id = @NewValueON Table.id = @IdToEdit AND other_table.id = @NewValue
2赞 Roger Ray 11/27/2013
@CharlesWood是的。我在MySQL中也有同样的问题。如果有人知道如何将其实现到 MySQL 并与大家分享,那就太好了。我相信很多人都在寻找MySQL版本的解决方案
1赞 ThinkCode 1/21/2014
如何在集合中使用别名?更新表 set a.col1 = b.col2 from table a inner join table2 b on a.id = b.id;相反,我必须使用更新表set table.col1 = b.col2 from table a inner join table2 b on a.id = b.id;
17赞 dennislloydjr 8/22/2015
在某种程度上,我经常喜欢先将 UPDATE 查询编写为 SELECT 语句,这样我就可以在执行之前看到将要更新的数据。Sebastian 在最近的一篇博文中介绍了一种技术:sqlity.net/en/2867/update-from-select
3赞 bladekp 11/16/2019
对于 MySQL 数据库:UPDATE Table_A, Table_B SET Table_A.col1 = Table_B.col1 WHERE Table_A.id = Table_B.table_a_id
232赞 SQLMenace 2/25/2010 #2

单程

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'

评论

0赞 Pouria Moosavi 11/26/2022
SQL 服务器 12.似乎它是从而不是从 .因此,无论我们尝试更新哪一行,它始终以相同的值更新。t.idJOIN tUPDATE tt
308赞 quillbreaker 9/9/2011 #3

我会将 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 子句,您甚至会影响不需要受影响的行,这(可能)会导致索引重新计算或触发实际上不应该触发的触发器。

评论

7赞 Martin Smith 11/6/2011
不过,这假定没有一列是可为 null 的。
4赞 quillbreaker 11/12/2011
你是对的,我是用手打字的。我在 where 语句中添加了第三个和第四个子句来处理这个问题。
49赞 Martin Smith 5/27/2012
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))更简洁。
5赞 Barka 5/15/2013
语句不应该在 where 子句中也包含这两个吗?(other_table.col1 为 null,table.col1 不为 null)或 (other_table.col2 为 null,table.col2 不为 null)
4赞 quillbreaker 5/17/2013
取决于是否要将目标中的 null 替换为源中的 null。通常,我不这样做。但是,如果你这样做了,Martin 对 where 子句的构造是最好用的。
63赞 HLGEM 9/9/2011 #4

我添加它只是为了让您看到一种快速编写它的方法,以便您可以在进行更新之前检查将要更新的内容。

UPDATE Table 
SET  Table.col1 = other_table.col1,
     Table.col2 = other_table.col2 
--select Table.col1, other_table.col,Table.col2,other_table.col2, *   
FROM     Table 
INNER JOIN     other_table 
    ON     Table.id = other_table.id 
874赞 onedaywhen 9/9/2011 #5

在 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;

评论

144赞 brichins 5/16/2012
MERGE也可用于“更新插入”记录;也就是说,如果存在匹配记录,则在未找到匹配项时创建新记录UPDATEINSERT
20赞 Paul Suart 4/3/2013
这比同等更新快了大约 10 倍......加入声明。
19赞 Möoz 8/8/2013
MERGE 也可用于 DELETE。但要小心 MERGE,因为 TARGET 表不能是远程表。
26赞 Simon D 8/27/2014
合并错误:mssqltips.com/sqlservertip/3074/...
18赞 onedaywhen 10/3/2014
@SimonD:选择任何SQL Server关键字,您都会发现错误。你的观点?我敢打赌,与这些错误相关的错误(以及更基本的错误)比 ,人们刚刚学会了与它们共存,它们成为景观的一部分(“特征”)。考虑到博客在街区的新孩子时并不存在。UPDATEMERGEUPDATE
193赞 Martin Smith 11/6/2011 #6

另一种尚未提及的可能性是将语句本身放入 CTE 中,然后更新 CTE。SELECT

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 ... FROMUpdateMERGE

评论

4赞 Raptor 10/8/2012
这个名字有什么含义吗?CTE
21赞 Martin Smith 10/8/2012
@ShivanRaptor - 它是 Common Table Expression 的首字母缩写。在这种情况下,只是一个任意别名。
3赞 VeeTheSecond 8/30/2013
这也适用于多个 CTE:;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
848赞 Jamal 1/23/2012 #7
UPDATE YourTable 
SET Col1 = OtherTable.Col1, 
    Col2 = OtherTable.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) AS OtherTable
WHERE 
    OtherTable.ID = YourTable.ID

评论

23赞 Alan Macdonald 2/1/2016
这往往适用于几乎所有的DBMS,这意味着一次学习,随处执行。如果这对您来说比性能更重要,您可能更喜欢这个答案,特别是如果您的更新是一次性的,以更正某些数据。
3赞 Jason S 7/15/2019
如果需要使用第二个表的聚合设置第一个表,则可以将聚合放在 select 子查询中,因为您不能这样做(或任何其他聚合函数)。这比罗宾·戴(Robin Day)的答案要好。SET Table_A.col1 = SUM(Table_B.col1)
0赞 Anthony Iacono 6/7/2021
我真的很喜欢这个解决方案,因为它感觉像是对工作方式的自然赞美。感谢分享!INSERT ... SELECT
0赞 Shehan Silva 2/14/2023
谢谢。这是最简单、最容易理解的方法。
113赞 rageit 5/23/2012 #8

使用别名:

UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id
75赞 Ryan 6/12/2012 #9

这可能是执行更新的利基原因(例如,主要用于过程),或者对其他人来说可能是显而易见的,但还应该说明,您可以在不使用 join 的情况下执行 update-select 语句(以防您更新的表没有公共字段)。

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

评论

1赞 Panzercrisis 12/8/2021
我觉得这应该是公认的答案,因为它使事情变得简单而切中要害。
142赞 Adrian Macneil 10/5/2012 #10

作为记录(以及其他像我一样搜索的人),您可以在MySQL中像这样进行操作:

UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id
84赞 Patrick Frenette 11/14/2012 #11

简单的方法是:

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

评论

25赞 HLGEM 4/25/2013
这不是 SQl Server 语法,在 SQL Server 中不起作用
68赞 efirat 5/2/2013 #12

下面是另一个有用的语法:

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”检查它是否为 null。

评论

1赞 Bludzee 3/24/2022
唯一对我有用的答案。我正在使用MariaDB,我的查询是这样的:SELECT value FROM table_1 INNER JOIN ( SELECT * FROM table_2 WHERE ..... ) ON ( ...... )
45赞 Aleksandr Fedorenko 9/25/2013 #13

以下示例使用派生表(FROM 子句后面的 SELECT 语句)返回旧值和新值以进行进一步更新:

UPDATE x
SET    x.col1 = x.newCol1,
       x.col2 = x.newCol2
FROM   (SELECT t.col1,
               t2.col1 AS newCol1,
               t.col2,
               t2.col2 AS newCol2
        FROM   [table] t
               JOIN other_table t2
                 ON t.ID = t2.ID) x
60赞 Hentold 10/3/2013 #14

如果使用 MySQL 而不是 SQL Server,则语法为:

UPDATE Table1
INNER JOIN Table2
ON Table1.id = Table2.id
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2

评论

0赞 Saad Abbasi 11/27/2020
如果我们想更新怎么办?我们将如何做到这一点。表二是在查询条件的基础上提取的。Table2.col1
22赞 russ 6/18/2014 #15

用:

drop table uno
drop table dos

create table uno
(
    uid int,
    col1 char(1),
    col2 char(2)
)
create table dos
(
    did int,
    col1 char(1),
    col2 char(2),
    [sql] char(4)
)
insert into uno(uid) values (1)
insert into uno(uid) values (2)
insert into dos values (1,'a','b',null)
insert into dos values (2,'c','d','cool')

select * from uno 
select * from dos

也:

update uno set col1 = (select col1 from dos where uid = did and [sql]='cool'), 
col2 = (select col2 from dos where uid = did and [sql]='cool')

或:

update uno set col1=d.col1,col2=d.col2 from uno 
inner join dos d on uid=did where [sql]='cool'

select * from uno 
select * from dos

如果两个表中的 ID 列名相同,则只需将表名放在要更新的表之前,并为所选表使用别名,即:

update uno set col1 = (select col1 from dos d where uno.[id] = d.[id] and [sql]='cool'),
col2  = (select col2 from dos d where uno.[id] = d.[id] and [sql]='cool')
52赞 jakubiszon 6/28/2014 #16

如果你想把表与它自己连接起来(这不会经常发生):

update t1                    -- just reference table alias here
set t1.somevalue = t2.somevalue
from table1 t1               -- these rows will be the targets
inner join table1 t2         -- these rows will be used as source
on ..................        -- the join clause is whatever suits you

评论

8赞 Mark Hurd 6/30/2014
+1,但您应该使用相关的别名,例如 和,而不是(或以及)注释。targett1sourcet1
14赞 Mateen 10/1/2014 #17

以下解决方案适用于MySQL数据库:

UPDATE table1 a , table2 b 
SET a.columname = 'some value' 
WHERE b.columnname IS NULL ;
14赞 Cornezuelo del Centeno 7/31/2015 #18
UPDATE table AS a
INNER JOIN table2 AS b
ON a.col1 = b.col1
INNER JOIN ... AS ...
ON ... = ...
SET ...
WHERE ...
59赞 Jason Clark 11/30/2015 #19

在 SQL 数据库中使用 INNER JOIN 从 SELECT 执行 UPDATE

由于这篇文章的回复太多了,投票最多,我想我也会在这里提供我的建议。虽然这个问题很有趣,但我在许多论坛网站上看到过,并使用带有屏幕截图的 INNER JOIN 做出了解决方案。

首先,我创建了一个名为 schoolold 的表,并插入了有关其列名的几条记录并执行它。

然后我执行SELECT命令来查看插入的记录。

然后,我创建了一个名为 schoolnew 的新表,并对其执行了类似的上述操作。

然后,要查看其中插入的记录,我执行SELECT命令。

现在,我想在第三行和第四行进行一些更改,以完成此操作,我使用INNER JOIN执行UPDATE命令。

为了查看更改,我执行了 SELECT 命令。

您可以看到,通过使用带有 UPDATE 语句的 INNER JOIN,如何轻松地将表 schoolold 的第三和第四条记录替换为表 schoolnew

50赞 Pரதீப் 12/13/2015 #20

更新比这里的其他答案更具可读性:CTE

;WITH cte
     AS (SELECT col1,col2,id
         FROM   other_table
         WHERE  sql = 'cool')
UPDATE A
SET    A.col1 = B.col1,
       A.col2 = B.col2
FROM   table A
       INNER JOIN cte B
               ON A.id = B.id
27赞 sqluser 2/25/2016 #21

另一种方法是使用派生表:

UPDATE t
SET t.col1 = a.col1
    ,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id

示例数据

DECLARE @tbl1 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))
DECLARE @tbl2 TABLE (id INT, col1 VARCHAR(10), col2 VARCHAR(10))

INSERT @tbl1 SELECT 1, 'a', 'b' UNION SELECT 2, 'b', 'c'

INSERT @tbl2 SELECT 1, '1', '2' UNION SELECT 2, '3', '4'

UPDATE t
SET t.col1 = a.col1
    ,t.col2 = a.col2
FROM (
SELECT id, col1, col2 FROM @tbl2) a
INNER JOIN @tbl1 t ON t.id = a.id

SELECT * FROM @tbl1
SELECT * FROM @tbl2
12赞 Govind Tupkar 9/8/2016 #22

从 select 语句更新的另一种方法:

UPDATE A
SET A.col = A.col,B.col1 = B.col1
FROM  first_Table AS A
INNER JOIN second_Table AS B  ON A.id = B.id WHERE A.col2 = 'cool'

评论

2赞 lmo 9/9/2016
这个答案出现在低质量的审查队列中,可能是因为你没有提供任何代码的解释。如果此代码回答了问题,请考虑在答案中添加一些解释代码的文本。这样一来,你就更有可能获得更多的赞成票,并帮助提问者学习新的东西。
25赞 Yaman 12/1/2016 #23
UPDATE TQ
SET TQ.IsProcessed = 1, TQ.TextName = 'bla bla bla'
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0

若要确保更新所需的内容,请选择“首先”

SELECT TQ.IsProcessed, 1 AS NewValue1, TQ.TextName, 'bla bla bla' AS NewValue2
FROM TableQueue TQ
INNER JOIN TableComment TC ON TC.ID = TQ.TCID
WHERE TQ.IsProcessed = 0
24赞 Bartosz X 1/26/2017 #24

甚至还有一种更短的方法,您可能会感到惊讶:

示例数据集:

CREATE TABLE #SOURCE ([ID] INT, [Desc] VARCHAR(10));
CREATE TABLE #DEST   ([ID] INT, [Desc] VARCHAR(10));

INSERT INTO #SOURCE VALUES(1,'Desc_1'), (2, 'Desc_2'), (3, 'Desc_3');
INSERT INTO #DEST   VALUES(1,'Desc_4'), (2, 'Desc_5'), (3, 'Desc_6');

法典:

UPDATE #DEST
SET #DEST.[Desc] = #SOURCE.[Desc]
FROM #SOURCE
WHERE #DEST.[ID] = #SOURCE.[ID];

评论

1赞 Bartosz X 1/26/2017
是 - 故意没有 JOIN,否 - 这不能应用于表变量。
1赞 Jenna Leaf 2/3/2017
我认为如果您在 #SOURCE 上使用 [_id] 而不是与 #DESTINATION 的 [ID] 相同,他们可能会让您执行 JOIN。“在 #DESTINATION.ID=#SOURCE._id.甚至使用像@tbl这样的表变量,“on PermTable.ID=@memorytbl._id”。你试过吗?我正在用电话回复这个问题,没有电脑可以尝试。
2赞 Martin Smith 2/6/2017
这与从 SELECT 更新有什么关系?
2赞 Bartosz X 2/6/2017
这是同样的想法,但另一种方法 - 您根本不需要将“select”放入更新语句中实现 JOIN 和 WHERE - 这是 SELECT 类型的查询,甚至无需编写 SELECT
44赞 Richard 2/21/2017 #25

如果您使用的是 SQL Server,则可以在不指定联接的情况下从一个表更新另一个表,只需从子句中链接这两个表即可。这使得 SQL 查询变得更加简单:where

UPDATE Table1
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2
FROM
    Table2
WHERE
    Table1.id = Table2.id
16赞 Johannes Wentu 4/27/2017 #26

在被接受的答案中,在:

SET
Table_A.col1 = Table_B.col1,
Table_A.col2 = Table_B.col2

我想补充一点:

OUTPUT deleted.*, inserted.*

我通常做的是将所有内容放入一个回滚支持的事务中,并使用 : 这样我就能看到即将发生的一切。当我对我所看到的感到满意时,我会将 ."OUTPUT"ROLLBACKCOMMIT

我通常需要记录我所做的事情,所以我在运行回滚查询时使用该选项,并保存脚本和 OUTPUT 的结果。(当然,如果我更改了太多行,这是不切实际的)"results to Text"

46赞 Abdul Azeez 1/31/2018 #27

在这里整合所有不同的方法。

  1. 选择更新
  2. 使用公用表表达式进行更新
  3. 合并

示例表结构如下,将从 Product_BAK 更新为 Product 表。

产品

CREATE TABLE [dbo].[Product](
    [Id] [int] IDENTITY(1, 1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    [Description] [nvarchar](100) NULL
) ON [PRIMARY]

Product_BAK

    CREATE TABLE [dbo].[Product_BAK](
        [Id] [int] IDENTITY(1, 1) NOT NULL,
        [Name] [nvarchar](100) NOT NULL,
        [Description] [nvarchar](100) NULL
    ) ON [PRIMARY]

1. 选择更新

    update P1
    set Name = P2.Name
    from Product P1
    inner join Product_Bak P2 on p1.id = P2.id
    where p1.id = 2

2. 使用公用表表达式进行更新

    ; With CTE as
    (
        select id, name from Product_Bak where id = 2
    )
    update P
    set Name = P2.name
    from  product P  inner join CTE P2 on P.id = P2.id
    where P2.id = 2

3. 合并

    Merge into product P1
    using Product_Bak P2 on P1.id = P2.id

    when matched then
    update set p1.[description] = p2.[description], p1.name = P2.Name;

在这个 Merge 语句中,如果在目标中没有找到匹配的记录,我们可以执行插入,但存在于源中,请查找语法:

    Merge into product P1
    using Product_Bak P2 on P1.id = P2.id;

    when matched then
    update set p1.[description] = p2.[description], p1.name = P2.Name;

    WHEN NOT MATCHED THEN
    insert (name, description)
    values(p2.name, P2.description);

评论

0赞 Peter Mortensen 2/3/2022
“请找到语法”是什么意思?你能详细说明一下吗?
3赞 Erfan Mohammadi 9/1/2018 #28

您可以在 SQL Server 中使用它进行更新:

UPDATE
    T1
SET
   T1.col1 = T2.col1,
   T1.col2 = T2.col2
FROM
   Table1 AS T1
INNER JOIN Table2 AS T2
    ON T1.id = T2.id
WHERE
    T1.col3 = 'cool'

评论

0赞 Peter Mortensen 2/3/2022
你说的“从这个用于更新”是什么意思(似乎难以理解)?“from”和/或“update”是否为文字 (SQL)?你能解决它吗?(但是如果没有“编辑:”,“更新:”或类似内容 - 问题/答案应该看起来像是今天写的一样。
1赞 Saikh Rakif 10/8/2018 #29
declare @tblStudent table (id int,name varchar(300))
declare @tblMarks table (std_id int,std_name varchar(300),subject varchar(50),marks int)

insert into @tblStudent Values (1,'Abdul')
insert into @tblStudent Values(2,'Rahim')

insert into @tblMarks Values(1,'','Math',50)
insert into @tblMarks Values(1,'','History',40)
insert into @tblMarks Values(2,'','Math',30)
insert into @tblMarks Values(2,'','history',80)


select * from @tblMarks

update m
set m.std_name=s.name
 from @tblMarks as m
left join @tblStudent as s on s.id=m.std_id

select * from @tblMarks

评论

0赞 Peter Mortensen 2/3/2022
解释是有序的。例如,想法/要点是什么?它测试了什么?哪个版本的 SQL Server?从帮助中心:“......始终解释为什么您提出的解决方案是合适的,以及它是如何工作的”。请通过编辑(更改)您的答案来回复,而不是在评论中(没有“编辑:”,“更新:”或类似内容 - 答案应该看起来像今天写的一样)。
10赞 Santhana 11/7/2018 #30

选项 1:使用内部联接:

UPDATE
    A
SET
    A.col1 = B.col1,
    A.col2 = B.col2
FROM
    Some_Table AS A
    INNER JOIN Other_Table AS B
        ON A.id = B.id
WHERE
    A.col3 = 'cool'

选项 2:Co 相关子查询

UPDATE table 
SET Col1 = B.Col1, 
    Col2 = B.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) B
WHERE 
    B.ID = table.ID

评论

1赞 Pratyush Raizada 11/26/2019
它对你有用吗?我使用了完全相同的查询,但在使用内部连接时出现错误,别名无法解析。但是,共同相关的子查询工作得很好。
0赞 Pratyush Raizada 1/7/2020
我没有确切的错误日志,但在分配之前引用了别名 A,这导致了错误。
0赞 pat capozzi 3/20/2020
我使用了相关的子查询
0赞 Peter Mortensen 2/3/2022
这是在什么地方测试的?SQL ServerMySQL的?别的?什么版本?
-1赞 rishi jain 11/22/2018 #31

相同的解决方案可以以略有不同的方式编写,因为我想只设置一次列。我已经写了关于这两张表的文章。它在MySQL中工作。

UPDATE Table t,
(SELECT col1, col2 FROM other_table WHERE sql = 'cool' ) o
SET t.col1 = o.col1, t.col2=o.col2
WHERE t.id = o.id
-4赞 CAGDAS AYDIN 11/22/2018 #32

喜欢这个;但您必须确保更新表和 from 之后的表相同。

UPDATE Table SET col1, col2
FROM table
inner join other_table Table.id = other_table.id
WHERE sql = 'cool'

评论

1赞 theking2 7/5/2021
此语法不正确。你能编辑你的答案,告诉我们你的意思吗?
0赞 Peter Mortensen 2/3/2022
这在一定程度上是不可理解的。你能解决它吗?
10赞 Rokonz Zaz 3/14/2019 #33
UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
[WHERE conditions];

在 SQL Server 中使用另一个表中的数据更新一个表时 UPDATE 语句的语法。

0赞 Ricardo Rivera Nieves 4/9/2020 #34

我以前使用过 INSERT SELECT。对于那些想要使用新东西的人来说,这里有一个类似的解决方案,但它要短得多:

UPDATE table1                                          // Table that's going to be updated.
LEFT JOIN                                              // Type of join.
    table2 AS tb2                                      // Second table and rename for easy.
ON
    tb2.filedToMatchTables = table1.fieldToMatchTables // Fields to connect both tables.
SET
    fieldFromTable1 = tb2.fieldFromTable2;             // Field to be updated on table1.

    field1FromTable1 = tb2.field1FromTable2,           // This is in the case you need to
    field1FromTable1 = tb2.field1FromTable2,           // update more than one field.
    field1FromTable1 = tb2.field1FromTable2;           // Remember to put ; at the end.

8赞 theking2 6/10/2020 #35

需要指出的是,正如其他人一样,MySQLMariaDB使用不同的语法。此外,它还支持非常方便的 USING 语法(与 T/SQL 相比)。此外,INNER JOIN 是 JOIN 的同义词。因此,原始问题中的查询最好在MySQL中实现,如下所示:

UPDATE
    Some_Table AS Table_A

JOIN
    Other_Table AS Table_B USING(id)

SET
    Table_A.col1 = Table_B.col1,
    Table_A.col2 = Table_B.col2

WHERE
    Table_A.col3 = 'cool'

我没有在其他答案中看到所问问题的解决方案,因此我的两美分。(在PHP 7.4.0 MariaDB 10.4.10上测试)

评论

0赞 Peter Mortensen 1/30/2022
回复“原始问题中的查询”:什么?第一个修订版用 SQL Server(Microsoft 产品)标记。
-1赞 RckLN 9/27/2021 #36

最佳做法:在公司中使用的 SQL Server 中更新行并保存

 WITH t AS
         (
           SELECT UserID, EmailAddress, Password, Gender, DOB, Location,
           Active  FROM Facebook.Users
         )
 UPDATE t SET Active = 0

这是更新记录的最安全方法,您可以通过此查看我们将要更新的内容。 来源: URL

评论

0赞 Peter Mortensen 1/30/2022
第一行是不可理解的。你能解决它吗?
-4赞 Pasindu Perera 2/22/2022 #37

Oracle SQL(使用别名):

UPDATE Table T 
SET T.col1 = (SELECT OT.col1 WHERE OT.id = T.id),
T.col2 = (SELECT OT.col2 WHERE OT.id = T.id);
1赞 Vova 2/3/2023 #38

对我而言,SQLite3 效果很好,在 INNER SELECT 之后使用 SELECT 更新行。

UPDATE clients
SET col1 = '2023-02-02 18:51:30.826621'
FROM (
      SELECT * FROM clients dc WHERE dc.phone NOT IN (
               SELECT do.phone FROM dclient_order do WHERE do.order_date > '2023-01-01' GROUP BY do.phone
               )
      ) NewTable
WHERE clients.phone = NewTable.phone;
0赞 Somendra Kanaujia 9/29/2023 #39
 UPDATE 
     A
 SET
     A.col1 = B.col1,
     A.col2 = B.col2
 FROM
     Some_Table AS A
     INNER JOIN Other_Table AS B
         ON A.id = B.id
 WHERE
     A.col3 = 'cool'

评论

2赞 Jeremy Caney 9/29/2023
感谢您有兴趣为 Stack Overflow 社区做出贡献。这个问题已经有了不少答案,包括一个已经得到社区广泛验证的答案。你确定你的方法以前没有给出过吗?如果是这样,解释一下你的方法有何不同,在什么情况下你的方法可能更受欢迎,和/或为什么你认为前面的答案是不够的,这将是有用的。你能编辑你的答案以提供解释吗?