Làm cách nào để tôi CẬP NHẬT từ một CHỌN trong SQL Server?


3695

Trong SQL Server , có thể INSERTvào bảng bằng cách sử dụng SELECTcâu lệnh:

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

Có phải cũng có thể cập nhật thông qua một SELECT? Tôi có một bảng tạm thời chứa các giá trị và muốn cập nhật một bảng khác bằng các giá trị đó. Có lẽ một cái gì đó như thế này:

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

Câu trả lời:


5372
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'

16
Nếu bạn đang chỉnh sửa liên kết giữa các bảng ( SET Table.other_table_id = @NewValue) thì hãy thay đổi câu lệnh BẬT thành một cái gì đó nhưON Table.id = @IdToEdit AND other_table.id = @NewValue
Trisped

11
@RogerRay, câu hỏi này là về Microsoft SQL Server. Thật không may, cú pháp giữa các triển khai SQL khác nhau có thể khác nhau.
Charles Wood

2
@CharlesWood vâng. Tôi có cùng một câu hỏi trong MySQL. Sẽ thật tuyệt nếu ai đó biết cách triển khai nó lên MySQL và chia sẻ với mọi người. Tôi chắc chắn nhiều người đang tìm kiếm một giải pháp phiên bản MySQL
Roger Ray

1
Làm cách nào để sử dụng bí danh trong tập hợp? bảng cập nhật đặt a.col1 = b.col2 từ bảng a tham gia bên trong bảng2 b trên a.id = b.id; Thay vào đó, tôi phải sử dụng bảng cập nhật, đặt bảng.col1 = b.col2 từ bảng a tham gia bên trong bảng2 b trên a.id = b.id;
ThinkCode

11
Hơi liên quan, tôi thường thích viết các truy vấn CẬP NHẬT của mình dưới dạng các câu lệnh CHỌN trước để tôi có thể xem dữ liệu sẽ được cập nhật trước khi tôi thực thi. Sebastian trình bày một kỹ thuật cho điều này trong một bài đăng trên blog gần đây: sqlity.net/en/2867/update-from-select
dennislloydjr

777

Trong SQL Server 2008 (hoặc tốt hơn), sử dụng 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;

Cách khác:

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;

123
MERGEcũng có thể được sử dụng cho các bản ghi "Upserting"; nghĩa là, UPDATEnếu bản ghi khớp tồn tại, INSERTbản ghi mới nếu không tìm thấy kết quả khớp
brichins

16
Điều này nhanh hơn khoảng 10 lần so với bản cập nhật tương đương ... tham gia tuyên bố với tôi.
Paul Suart

17
MERGE cũng có thể được sử dụng để XÓA. Nhưng hãy cẩn thận với MERGE vì bảng TARGET không thể là bảng từ xa.
Möoz

24
Hợp nhất các lỗi: mssqltips.com/sqlservertip/3074/ từ
Simon D

16
@SimonD: chọn bất kỳ từ khóa SQL Server nào và bạn sẽ tìm thấy lỗi. Điểm của bạn? Tôi cá rằng có nhiều lỗi hơn (và cả những lỗi cơ bản nữa) liên quan đến UPDATEhơn MERGE, mọi người vừa học cách sống với chúng và chúng trở thành một phần của cảnh quan ('tính năng'). Hãy xem xét rằng các blog không tồn tại khi UPDATEđứa trẻ mới vào khối.
onedaywhen

673
UPDATE YourTable 
SET Col1 = OtherTable.Col1, 
    Col2 = OtherTable.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) AS OtherTable
WHERE 
    OtherTable.ID = YourTable.ID

7
Cho đến nay đơn giản nhất! Tuy nhiên, bạn thiếu trường ID từ CHỌN bên trong. Bạn sẽ cần điều này để mệnh đề WHERE hoạt động
John Doherty

12
Điều này sẽ có xu hướng hoạt động trên hầu hết các DBMS, có nghĩa là học một lần, thực hiện ở mọi nơi. Nếu điều đó quan trọng với bạn hơn hiệu suất, bạn có thể thích câu trả lời này, đặc biệt nếu bản cập nhật của bạn là một thứ để sửa một số dữ liệu.
Alan Macdonald

2
Nếu bạn cần đặt bảng đầu tiên với các tổng hợp từ bảng thứ hai, bạn có thể đặt các tổng hợp trong truy vấn con chọn, vì bạn không thể làm SET Table_A.col1 = SUM(Table_B.col1)(hoặc bất kỳ hàm tổng hợp nào khác). Vì vậy, tốt hơn câu trả lời của Robin Day cho mục đích này.
Jason S

280

Tôi sẽ sửa đổi câu trả lời tuyệt vời của Robin thành như sau:

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
)

Nếu không có mệnh đề WHERE, bạn sẽ ảnh hưởng đến các hàng thậm chí không cần bị ảnh hưởng, điều này có thể (có thể) gây ra tính toán lại chỉ số hoặc kích hoạt lửa mà thực sự không nên bị sa thải.


7
Điều này giả định rằng không có cột nào là nullable.
Martin Smith

4
Bạn nói đúng, tôi đã gõ ví dụ bằng tay. Tôi đã thêm một mệnh đề thứ ba và thứ tư vào câu lệnh where để giải quyết vấn đề đó.
quillbreaker

46
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))ngắn gọn hơn
Martin Smith

5
Không nên tuyên bố cũng chứa hai trong mệnh đề where? (other_table.col1 là null và table.col1 không phải là null) hoặc (other_table.col2 là null và table.col2 không null)
Barka

4
Phụ thuộc vào nếu bạn muốn thay thế null ở đích bằng null từ nguồn. Thường xuyên, tôi không. Nhưng nếu bạn làm thế, việc Martin xây dựng mệnh đề where là điều tốt nhất để sử dụng.
quillbreaker

204

Một chiều

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'

165

Một khả năng khác chưa được đề cập là chỉ cần SELECTđưa chính câu lệnh vào CTE và sau đó cập nhật 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

Điều này có lợi ích là dễ dàng tự chạy SELECTcâu lệnh để kiểm tra kết quả, nhưng nó yêu cầu bạn phải đặt bí danh cho các cột như trên nếu chúng được đặt tên giống nhau trong các bảng nguồn và đích.

Điều này cũng có giới hạn tương tự như UPDATE ... FROMcú pháp độc quyền được hiển thị trong bốn câu trả lời khác. Nếu bảng nguồn nằm ở nhiều phía của liên kết một-nhiều thì việc xác định các bản ghi tham gia phù hợp có thể sẽ được sử dụng trong Update(một vấn đề MERGEtránh được bằng cách đưa ra lỗi nếu có nỗ lực cập nhật cùng một hàng nhiều hơn một lần).


3
Có bất kỳ ý nghĩa của tên CTE?
Raptor

19
@ShivanRaptor - Đây là từ viết tắt của Biểu thức bảng chung . Chỉ là một bí danh tùy ý trong trường hợp này.
Martin Smith

3
Điều này cũng hoạt động tốt với nhiều ;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
CTE

117

Đối với bản ghi (và những người khác đang tìm kiếm như tôi), bạn có thể làm điều đó trong MySQL như thế này:

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

Đơn giản nhất? Cảm ơn ...
MarcoZen

96

Sử dụng bí danh:

UPDATE t
   SET t.col1 = o.col1
  FROM table1 AS t
         INNER JOIN 
       table2 AS o 
         ON t.id = o.id

73

Cách đơn giản để làm điều đó là:

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

2
Bạn được định dạng tốt hơn; Ngoài ra, khi sử dụng một mục phụ, bạn (và của Adrian) hoạt động đáng tin cậy hơn định dạng khác. Cảm ơn đã gửi câu trả lời của bạn.
Ben West

20
Đây không phải là cú pháp Máy chủ SQl và nó sẽ không hoạt động trong máy chủ SQL
HLGEM

Điều này làm việc rất tốt trong SQL Alchemy. Có lẽ không phải những gì câu hỏi, nhưng nó chắc chắn đã giúp tôi. :)
JGTaylor

61

Đây có thể là một lý do thích hợp để thực hiện cập nhật (ví dụ: chủ yếu được sử dụng trong thủ tục) hoặc có thể rõ ràng với người khác, nhưng cũng cần phải nói rằng bạn có thể thực hiện câu lệnh chọn cập nhật mà không cần sử dụng phép nối (trong trường hợp các bảng bạn đang cập nhật giữa không có trường chung).

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

59

Đây là một cú pháp hữu ích khác:

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

Nó kiểm tra xem nó có rỗng hay không bằng cách sử dụng "WHERE EXIST".


52

Tôi chỉ thêm cái này để bạn có thể thấy một cách nhanh chóng để viết nó để bạn có thể kiểm tra những gì sẽ được cập nhật trước khi thực hiện cập nhật.

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 

52

Nếu bạn sử dụng MySQL thay vì SQL Server, cú pháp là:

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

50

CẬP NHẬT từ CHỌN với INNER THAM GIA trong Cơ sở dữ liệu SQL

Vì có quá nhiều bài trả lời của bài đăng này, được bình chọn nhiều nhất, tôi nghĩ tôi cũng sẽ cung cấp đề xuất của mình ở đây. Mặc dù câu hỏi rất thú vị, tôi đã thấy trong nhiều trang diễn đàn và đưa ra giải pháp bằng cách sử dụng INNER THAM GIA bằng ảnh chụp màn hình.

Lúc đầu, tôi đã tạo một bảng có tên là schoolold và chèn một vài bản ghi liên quan đến tên cột của chúng và thực hiện nó.

Sau đó, tôi thực hiện lệnh SELECT để xem các bản ghi được chèn.

Sau đó, tôi đã tạo một bảng mới có tên là schoolnew và thực hiện tương tự các hành động trên đó.

Sau đó, để xem các bản ghi được chèn trong đó, tôi thực thi lệnh SELECT.

Bây giờ, ở đây tôi muốn thực hiện một số thay đổi ở hàng thứ ba và thứ tư, để hoàn thành hành động này, tôi thực hiện lệnh CẬP NHẬT với INNER THAM GIA .

Để xem các thay đổi tôi thực hiện lệnh SELECT .

Bạn có thể xem như thế nào Thứ ba và thứ tư kỷ lục của bảng schoolold dễ dàng thay thế bằng bảng schoolnew bằng cách sử dụng INNER JOIN với câu lệnh UPDATE.


43

Và nếu bạn muốn tham gia bàn với chính nó (điều này sẽ không xảy ra quá thường xuyên):

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
+1 nhưng bạn nên sử dụng các tên bí danh có liên quan như targett1sourcet1thay vì (hoặc cũng như) các bình luận.
Đánh dấu

42

Ví dụ sau sử dụng bảng dẫn xuất, câu lệnh CHỌN sau mệnh đề TỪ, để trả về các giá trị cũ và mới để cập nhật thêm:

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

41

Cập nhật thông qua CTEdễ đọc hơn các câu trả lời khác ở đây:

;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

39

Nếu bạn đang sử dụng SQL Server, bạn có thể cập nhật một bảng từ một bảng khác mà không chỉ định nối và chỉ cần liên kết hai bảng từ wheremệnh đề. Điều này làm cho một truy vấn SQL đơn giản hơn nhiều:

UPDATE Table1
SET Table1.col1 = Table2.col1,
    Table1.col2 = Table2.col2
FROM
    Table2
WHERE
    Table1.id = Table2.id

25

Hợp nhất tất cả các phương pháp khác nhau ở đây.

  1. Chọn cập nhật
  2. Cập nhật với biểu thức bảng chung
  3. Hợp nhất

Cấu trúc bảng mẫu bên dưới và sẽ cập nhật từ Product_BAK sang bảng Sản phẩm.

Sản phẩm

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

Sản phẩm_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. Chọn cập nhật

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

2. Cập nhật với biểu thức bảng chung

    ; 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. Hợp nhất

    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;

Trong câu lệnh Hợp nhất này, chúng ta có thể chèn thêm nếu không tìm thấy bản ghi khớp trong mục tiêu, nhưng tồn tại trong nguồn và vui lòng tìm cú pháp:

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

23

Một cách khác là sử dụng bảng dẫn xuất:

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

Dữ liệu mẫu

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

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

Để đảm bảo bạn đang cập nhật những gì bạn muốn, chọn trước

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

22

Thậm chí còn có một phương pháp ngắn hơn và nó có thể gây ngạc nhiên cho bạn:

Tập dữ liệu mẫu:

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');

Mã số:

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

1
CÓ - không có THAM GIA về mục đích và KHÔNG - điều này không thể được áp dụng trên các biến của bảng.
Bartosz X

1
Tôi nghĩ rằng nếu bạn sử dụng [_id] trên #SOURCE của bạn chứ không phải [ID] giống như # DESTINATION, họ có thể cho phép bạn THAM GIA. "trên # DESTINATION.ID = # SOURCE._id. Hoặc thậm chí sử dụng biến bảng như @tbl," trên PermTable.ID=@memorytbl._id ". Bạn đã thử chưa? Tôi đang dùng điện thoại để trả lời, không có máy tính nào để thử .
Lá Jenna

2
Điều này có liên quan gì đến việc cập nhật từ CHỌN?
Martin Smith

2
Đây là cùng một ý tưởng nhưng một phương pháp khác - bạn hoàn toàn không phải đặt "select" để đạt được THAM GIA và WHERE trong câu lệnh cập nhật - đó là loại truy vấn CHỌN mà không cần viết CHỌN
Bartosz X

19

Sử dụng:

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

HOẶC:

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')

HOẶC LÀ:

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

Nếu tên cột ID giống nhau trong cả hai bảng thì chỉ cần đặt tên bảng trước bảng cần cập nhật và sử dụng bí danh cho bảng đã chọn, nghĩa là:

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')

14

Trong câu trả lời được chấp nhận, sau:

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

Tôi sẽ thêm:

OUTPUT deleted.*, inserted.*

Những gì tôi thường làm là đưa mọi thứ vào một giao dịch được hỗ trợ và sử dụng "OUTPUT": theo cách này tôi thấy mọi thứ sắp xảy ra. Khi tôi hài lòng với những gì tôi thấy, tôi thay đổi ROLLBACKthành COMMIT.

Tôi thường cần ghi lại những gì tôi đã làm, vì vậy tôi sử dụng "results to Text"tùy chọn khi tôi chạy truy vấn cuộn và tôi lưu cả tập lệnh và kết quả của OUTPUT. (Tất nhiên điều này không thực tế nếu tôi thay đổi quá nhiều hàng)



12

Giải pháp dưới đây hoạt động cho cơ sở dữ liệu MySQL:

UPDATE table1 a , table2 b 
SET a.columname = 'some value' 
WHERE b.columnname IS NULL ;

12

Cách khác để cập nhật từ một tuyên bố chọn:

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'

5
Cách khác để cập nhật từ câu lệnh chọn Sự khác biệt với các câu trả lời khác là gì? Hãy giải thích câu trả lời của bạn. Hãy ghi nhớ: Một câu trả lời hay sẽ luôn có lời giải thích về những gì đã được thực hiện và tại sao nó được thực hiện theo cách như vậy, không chỉ cho OP mà còn cho khách truy cập tương lai của SO.
B001

Câu trả lời này xuất hiện trong hàng đánh giá chất lượng thấp, có lẽ vì bạn không cung cấp bất kỳ lời giải thích nào về mã. Nếu mã này trả lời câu hỏi, hãy xem xét thêm một số văn bản giải thích mã trong câu trả lời của bạn. Bằng cách này, bạn có nhiều khả năng nhận được nhiều upvote hơn - và giúp người hỏi tìm hiểu điều gì đó mới.
LMO

8

Tùy chọn 1: Sử dụng Nội bộ Tham gia:

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'

Tùy chọn 2: Truy vấn phụ liên quan

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

Nó đã làm việc cho bạn? Tôi đã sử dụng chính xác cùng một truy vấn nhưng có lỗi khi sử dụng kết nối bên trong, bí danh không được giải quyết. Tuy nhiên, truy vấn phụ liên quan làm việc hoàn hảo.
Pratyush Raizada

@PratyushRaizada bạn gặp lỗi gì?
Santhana

Tôi không có nhật ký lỗi chính xác nhưng bí danh A đã được tham chiếu trước khi gán, điều này gây ra lỗi.
Pratyush Raizada

Tôi đã sử dụng truy vấn phụ tương quan
pat capozzi

3
UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
[WHERE conditions];

Cú pháp cho câu lệnh CẬP NHẬT khi cập nhật một bảng với dữ liệu từ một bảng khác trong SQL Server


1

Bạn có thể sử dụng từ này để cập nhật trong máy chủ sql

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'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.