Bagaimana cara saya memutakhirkan dari SELECT di SQL Server?

3697

Di SQL Server , dimungkinkan untuk INSERTmenjadi tabel menggunakan SELECTpernyataan:

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

Apakah mungkin untuk memperbarui melalui SELECT? Saya memiliki tabel sementara yang berisi nilai-nilai dan ingin memperbarui tabel lain menggunakan nilai-nilai itu. Mungkin kira-kira seperti ini:

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

Jawaban:

5373
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'
Robin Day
sumber
16
Jika Anda mengedit tautan antar tabel ( SET Table.other_table_id = @NewValue) maka ubah pernyataan ON ke sesuatu sepertiON Table.id = @IdToEdit AND other_table.id = @NewValue
Dipotong
11
@RogerRay, pertanyaan ini tentang Microsoft SQL Server. Sayangnya, sintaksis antara berbagai implementasi SQL dapat bervariasi.
Charles Wood
2
@CharlesWood ya. Saya memiliki pertanyaan yang sama di MySQL. Akan lebih bagus jika seseorang tahu bagaimana mengimplementasikannya ke MySQL dan berbagi dengan semua orang. Saya yakin banyak orang mencari solusi versi MySQL
Roger Ray
1
Bagaimana cara menggunakan alias di set? perbarui tabel atur a.col1 = b.col2 dari tabel a join dalam table2 b di a.id = b.id; Sebagai gantinya saya harus menggunakan tabel pembaruan set table.col1 = b.col2 dari tabel a join join table2 b di a.id = b.id;
ThinkCode
11
Agak terkait, saya sering suka menulis permintaan UPDATE saya sebagai pernyataan SELECT terlebih dahulu sehingga saya bisa melihat data yang akan diperbarui sebelum saya jalankan. Sebastian meliput teknik untuk ini dalam posting blog baru-baru ini: sqlity.net/en/2867/update-from-select
dennislloydjr
777

Di SQL Server 2008 (atau lebih baik), gunakan 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;

Kalau tidak:

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;
suatu hari nanti
sumber
123
MERGEjuga dapat digunakan untuk catatan "Upserting"; yaitu, UPDATEjika ada catatan yang cocok, INSERTcatatan baru jika tidak ada yang cocok
brichins
16
Ini sekitar 10x lebih cepat dari pembaruan yang setara ... gabung pernyataan untuk saya.
Paul Suart
17
MERGE juga dapat digunakan untuk HAPUS. Tapi hati-hati dengan MERGE karena tabel TARGET tidak bisa berupa tabel jarak jauh.
Möoz
24
Gabungkan bug: mssqltips.com/sqlservertip/3074/…
Simon D
16
@SimonD: pilih kata kunci SQL Server dan Anda akan menemukan bug. Maksudmu Saya bertaruh ada lebih banyak bug (dan yang lebih mendasar juga) yang berhubungan dengan UPDATEdaripada MERGE, orang-orang baru saja belajar untuk hidup bersama mereka dan mereka menjadi bagian dari lanskap ('fitur'). Pertimbangkan bahwa blog tidak ada kapan UPDATEanak baru di blok.
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
Jamal
sumber
7
Sejauh ini yang paling sederhana! Namun Anda kehilangan bidang ID dari SELECT dalam. Anda akan membutuhkan ini agar klausa WHERE berfungsi
John Doherty
12
Ini akan cenderung bekerja di hampir semua DBMS yang berarti belajar sekali, jalankan di mana-mana. Jika itu lebih penting bagi Anda daripada kinerja Anda mungkin lebih suka jawaban ini, terutama jika pembaruan Anda adalah salah satu untuk memperbaiki beberapa data.
Alan Macdonald
2
Jika Anda perlu mengatur tabel pertama dengan agregat dari yang kedua, Anda bisa meletakkan agregat di subquery pilih, karena Anda tidak bisa melakukan SET Table_A.col1 = SUM(Table_B.col1)(atau fungsi agregat lainnya). Jadi lebih baik daripada jawaban Robin Day untuk tujuan ini.
Jason S
280

Saya akan memodifikasi jawaban Robin yang luar biasa untuk yang berikut:

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
)

Tanpa klausa WHERE, Anda akan memengaruhi bahkan baris yang tidak perlu terpengaruh, yang dapat (mungkin) menyebabkan penghitungan ulang indeks atau pemicu kebakaran yang benar-benar tidak boleh dipecat.

quillbreaker
sumber
7
Ini mengasumsikan tidak ada kolom yang bisa dibatalkan.
Martin Smith
4
Anda benar, saya mengetik contoh dengan tangan. Saya telah menambahkan klausa ketiga dan keempat ke pernyataan di mana untuk menghadapinya.
quillbreaker
46
WHERE EXISTS(SELECT T1.Col1, T1.Col2 EXCEPT SELECT T2.Col1, T2.Col2))lebih ringkas.
Martin Smith
5
tidakkah seharusnya pernyataan itu juga memuat keduanya dalam klausa where? (other_table.col1 adalah nol dan table.col1 bukan nol) atau (other_table.col2 adalah nol dan table.col2 bukan nol)
Barka
4
Bergantung pada jika Anda ingin mengganti nol di tujuan dengan nol dari sumber. Seringkali, saya tidak melakukannya. Tetapi jika Anda melakukannya, konstruksi di mana klausa Martin adalah hal terbaik untuk digunakan.
quillbreaker
204

Satu arah

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'
SQLMenace
sumber
165

Kemungkinan lain yang belum disebutkan adalah hanya membuang SELECTpernyataan itu sendiri ke dalam CTE dan kemudian memperbarui 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

Ini memiliki manfaat yang mudah dijalankan SELECT pernyataan sendiri terlebih dahulu untuk memeriksa hasilnya, tetapi mengharuskan Anda untuk alias kolom seperti di atas jika mereka diberi nama yang sama dalam tabel sumber dan target.

Ini juga memiliki batasan yang sama dengan UPDATE ... FROMsintaksis berpemilik yang ditunjukkan pada empat jawaban lainnya. Jika tabel sumber ada di banyak sisi dari satu-ke-banyak bergabung maka itu tidak ditentukan mana dari catatan yang cocok mungkin akan digunakan dalam Update(masalah yang MERGEmenghindari dengan meningkatkan kesalahan jika ada upaya untuk memperbarui baris yang sama lebih dari sekali).

Martin Smith
sumber
3
apakah ada arti namanya CTE?
Raptor
19
@ShivanRaptor - Ini adalah singkatan untuk Common Table Expression . Hanya alias sembarang dalam hal ini.
Martin Smith
3
Ini juga bekerja dengan baik dengan beberapa CTE:;WITH SomeCompexCTE AS (...), CTEAsAbove AS (SELECT T1.Col1,... FROM T1 JOIN SomeComplexCTE...) UPDATE CTEAsAbove SET Col1=_Col1, ...
VeeTheSecond
117

Sebagai catatan (dan orang lain yang mencari seperti saya), Anda dapat melakukannya di MySQL seperti ini:

UPDATE first_table, second_table
SET first_table.color = second_table.color
WHERE first_table.id = second_table.foreign_id
Adrian Macneil
sumber
Paling sederhana? Terima kasih ...
MarcoZen
96

Menggunakan alias:

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

Cara sederhana untuk melakukannya adalah:

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
Patrick Frenette
sumber
2
Format Anda lebih baik; Juga, saat menggunakan subselect, milik Anda (dan Adrian) berfungsi lebih andal daripada format lainnya. Terima kasih telah mengirimkan jawaban Anda.
Ben West
20
Ini bukan sintaks SQl Server dan tidak akan bekerja di SQL server
HLGEM
Ini bekerja sangat baik dalam SQL Alchemy. Mungkin bukan pertanyaan yang diajukan, tetapi itu benar-benar membantu saya. :)
JGTaylor
61

Ini mungkin menjadi alasan khusus untuk melakukan pembaruan (misalnya, terutama digunakan dalam prosedur), atau mungkin jelas bagi orang lain, tetapi juga harus dinyatakan bahwa Anda dapat melakukan pernyataan pilih-pembaruan tanpa menggunakan gabungan (jika tabel yang Anda perbarui tidak memiliki bidang yang sama).

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
Ryan
sumber
59

Berikut ini sintaks yang berguna:

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

Ia memeriksa apakah itu nol atau tidak dengan menggunakan "WHERE EXIST".

efirat
sumber
52

Saya menambahkan ini hanya agar Anda dapat melihat cara cepat untuk menulisnya sehingga Anda dapat memeriksa apa yang akan diperbarui sebelum melakukan pembaruan.

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 
HLGEM
sumber
52

Jika Anda menggunakan MySQL daripada SQL Server, sintaksnya adalah:

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

PEMBARUAN dari SELECT dengan INNER BERGABUNG dalam SQL Database

Karena ada terlalu banyak balasan dari posting ini, yang paling banyak dipilih, saya pikir saya akan memberikan saran saya di sini juga. Meskipun pertanyaannya sangat menarik, saya telah melihat di banyak situs forum dan membuat solusi menggunakan INNER JOIN dengan screenshot.

Pada awalnya, saya telah membuat tabel dengan nama schoolold dan menyisipkan beberapa catatan sehubungan dengan nama kolom mereka dan menjalankannya.

Kemudian saya menjalankan perintah SELECT untuk melihat catatan yang dimasukkan.

Kemudian saya membuat tabel baru dengan nama schoolnew dan melakukan tindakan yang sama di atasnya.

Kemudian, untuk melihat catatan yang dimasukkan di dalamnya, saya menjalankan perintah SELECT.

Sekarang, Di sini saya ingin membuat beberapa perubahan di baris ketiga dan keempat, untuk menyelesaikan tindakan ini, saya menjalankan perintah UPDATE dengan INNER JOIN .

Untuk melihat perubahan, saya menjalankan perintah SELECT .

Anda dapat melihat bagaimana catatan ketiga dan keempat dari table schoolold mudah diganti dengan table schoolnew dengan menggunakan INNER BERGABUNG dengan pernyataan UPDATE.

Jason Clark
sumber
43

Dan jika Anda ingin bergabung dengan tabel itu sendiri (yang tidak akan terlalu sering terjadi):

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
jakubiszon
sumber
8
+1 tetapi Anda harus menggunakan nama alias yang relevan seperti targett1dan sourcet1bukan (atau juga) komentar.
Mark Hurd
42

Contoh berikut menggunakan tabel turunan, pernyataan SELECT setelah klausa FROM, untuk mengembalikan nilai lama dan baru untuk pembaruan lebih lanjut:

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
Aleksandr Fedorenko
sumber
41

Memperbarui melalui CTElebih mudah dibaca daripada jawaban lain di sini:

;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
P ரதீப்
sumber
39

Jika Anda menggunakan SQL Server, Anda dapat memperbarui satu tabel dari yang lain tanpa menentukan gabungan dan cukup menghubungkan keduanya dari whereklausa. Ini membuat kueri SQL yang lebih sederhana:

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

Menggabungkan semua pendekatan berbeda di sini.

  1. Pilih pembaruan
  2. Perbarui dengan ekspresi tabel umum
  3. Menggabungkan

Struktur tabel contoh di bawah dan akan diperbarui dari Product_BAK ke tabel Produk.

Produk

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. Pilih pembaruan

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

2. Perbarui dengan ekspresi tabel umum

    ; 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. Gabung

    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;

Dalam pernyataan Gabung ini, kita dapat melakukan inset jika tidak menemukan catatan yang cocok di target, tetapi ada di sumber dan silakan temukan sintaks:

    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);
Abdul Azeez
sumber
23

Cara lain adalah dengan menggunakan tabel turunan:

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

Contoh data

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
sqluser
sumber
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

Untuk memastikan Anda memperbarui apa yang Anda inginkan, pilih terlebih dahulu

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
Yaman
sumber
22

Bahkan ada metode yang lebih pendek dan mungkin mengejutkan bagi Anda:

Kumpulan data sampel:

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

Kode:

UPDATE #DEST
SET #DEST.[Desc] = #SOURCE.[Desc]
FROM #SOURCE
WHERE #DEST.[ID] = #SOURCE.[ID];
Bartosz X
sumber
1
YA - tidak ada GABUNG dengan sengaja dan TIDAK - ini tidak dapat diterapkan pada variabel tabel.
Bartosz X
1
Saya pikir jika Anda menggunakan [_id] pada #SOURCE Anda bukan [ID] sama dengan # DESTINATION's, mereka mungkin membiarkan Anda bergabung. "on # DESTINATION.ID = # SOURCE._id. Atau bahkan menggunakan variabel tabel seperti @tbl," pada PermTable.ID=@memorytbl._id ". Sudahkah Anda mencoba? Saya menggunakan telepon untuk membalas ini, tidak ada komputer untuk mencoba .
Jenna Leaf
2
Apa hubungannya ini dengan memperbarui dari SELECT?
Martin Smith
2
Ini adalah ide yang sama tetapi metode lain - Anda tidak perlu "pilih" sama sekali untuk mencapai BERGABUNG dan DIMANA dalam pernyataan pembaruan - yang merupakan jenis kueri SELECT bahkan tanpa menulis SELECT
Bartosz X
19

Menggunakan:

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

ANTARA:

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

ATAU:

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

Jika nama kolom ID sama di kedua tabel maka cukup letakkan nama tabel sebelum tabel diperbarui dan gunakan alias untuk tabel yang dipilih, yaitu:

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')
russ
sumber
14

Dalam jawaban yang diterima, setelah:

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

Saya akan menambahkan:

OUTPUT deleted.*, inserted.*

Apa yang biasanya saya lakukan adalah meletakkan segala sesuatu dalam transaksi yang didukung dan menggunakan "OUTPUT": dengan cara ini saya melihat segala sesuatu yang akan terjadi. Ketika saya senang dengan apa yang saya lihat, saya mengubahnya ROLLBACKmenjadi COMMIT.

Saya biasanya perlu mendokumentasikan apa yang saya lakukan, jadi saya menggunakan "results to Text"opsi ketika saya menjalankan permintaan yang didukung roll dan saya menyimpan skrip dan hasil OUTPUT. (Tentu saja ini tidak praktis jika saya mengubah terlalu banyak baris)

Johannes Wentu
sumber
12
UPDATE table AS a
INNER JOIN table2 AS b
ON a.col1 = b.col1
INNER JOIN ... AS ...
ON ... = ...
SET ...
WHERE ...
Cornezuelo del Centeno
sumber
2
Format ini yang berfungsi di MS Access. Menempatkan JOIN di akhir akan mendapatkan pesan "Sintaks kesalahan (operator hilang)". Contoh lebih lanjut di sini: fmsinc.com/microsoftaccess/query/snytax/update-query.html
travis
12

Solusi di bawah ini berfungsi untuk database MySQL:

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

Cara lain untuk memperbarui dari pernyataan pilih:

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'
Govind Tupkar
sumber
5
Cara lain untuk memperbarui dari pernyataan pilih. Apa bedanya dengan jawaban lain? Tolong jelaskan jawaban Anda. Perlu diingat: Jawaban yang baik akan selalu memiliki penjelasan tentang apa yang dilakukan dan mengapa dilakukan sedemikian rupa, tidak hanya untuk OP tetapi untuk pengunjung masa depan ke SO.
B001 ᛦ
Jawaban ini muncul dalam antrian ulasan berkualitas rendah, mungkin karena Anda tidak memberikan penjelasan kode apa pun. Jika kode ini menjawab pertanyaan, pertimbangkan untuk menambahkan beberapa teks yang menjelaskan kode dalam jawaban Anda. Dengan cara ini, Anda jauh lebih mungkin untuk mendapatkan lebih banyak upvotes - dan membantu si penanya mempelajari sesuatu yang baru.
lmo
8

Opsi 1: Menggunakan Inner Join:

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'

Opsi 2: Permintaan Sub terkait

UPDATE table 
SET Col1 = B.Col1, 
    Col2 = B.Col2 
FROM (
    SELECT ID, Col1, Col2 
    FROM other_table) B
WHERE 
    B.ID = table.ID
Santhana
sumber
Apakah itu berhasil untuk Anda? Saya menggunakan kueri yang sama persis tetapi mengalami kesalahan saat digunakan gabung bagian dalam, alias tidak bisa diselesaikan. Namun, sub-kueri terkait bekerja dengan baik.
Pratyush Raizada
@PratyushRaizada kesalahan apa yang Anda dapatkan?
Santhana
Saya tidak memiliki log kesalahan yang tepat tetapi alias A direferensikan sebelum penugasan, yang menyebabkan kesalahan.
Pratyush Raizada
Saya menggunakan sub kueri yang terkait
tepuk capozzi
3
UPDATE table1
SET column1 = (SELECT expression1
               FROM table2
               WHERE conditions)
[WHERE conditions];

Sintaks untuk pernyataan UPDATE saat memperbarui satu tabel dengan data dari tabel lain di SQL Server

Rokonz Zaz
sumber
1

Anda dapat menggunakan ini untuk pembaruan di 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'
Erfan Mohammadi
sumber