Di SQL Server, it's mungkin untuk insert
ke dalam sebuah tabel menggunakan pernyataan PILIH
:
INSERT INTO Table (col1, col2, col3)
SELECT col1, col2, col3
FROM other_table
WHERE sql = 'cool'
Itu juga mungkin untuk update melalui PILIH
? Saya punya tabel sementara yang berisi nilai-nilai dan ingin memperbarui tabel lain menggunakan nilai-nilai tersebut. Mungkin sesuatu seperti ini:
UPDATE Table SET col1, col2
SELECT col1, col2
FROM other_table
WHERE sql = 'cool'
WHERE Table.id = other_table.id
Di SQL Server 2008 (atau lebih baik), menggunakan MENGGABUNGKAN
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;
Atau:
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;
I'd memodifikasi Robin's jawaban yang sangat baik sebagai 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'll mempengaruhi bahkan baris yang don't perlu terpengaruh, yang bisa (mungkin) menyebabkan indeks perhitungan kembali atau api pemicu yang benar-benar seharusnya't telah dipecat.
Kemungkinan lain yang tidak disebutkan namun hanya chuck PILIH
pernyataan dirinya menjadi 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 sangat mudah untuk menjalankan PILIH
pernyataan sendiri pertama sanity check hasil, tapi itu tidak mengharuskan anda untuk alias kolom seperti di atas jika mereka diberi nama yang sama di sumber dan target tabel.
Ini juga memiliki keterbatasan yang sama sebagai milik UPDATE ... DARI
sintaks yang ditunjukkan dalam empat dari jawaban yang lain. Jika sumber tabel pada banyak sisi dari satu-ke-banyak yang bergabung maka undeterministic yang mungkin cocok bergabung dengan catatan akan digunakan dalam Update
(masalah yang MENGGABUNGKAN
menghindari dengan menaikkan sebuah kesalahan jika ada upaya untuk memperbarui baris yang sama lebih dari sekali).
Ini mungkin sebuah ceruk alasan untuk melakukan update (misalnya, terutama digunakan dalam prosedur), atau mungkin jelas bagi orang lain, tetapi hal ini juga harus menyatakan bahwa anda dapat melakukan update-pilih pernyataan tanpa menggunakan bergabung (dalam kasus tabel anda're memperbarui antara tidak memiliki bidang umum).
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
Berikut ini adalah 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 adalah null atau tidak dengan menggunakan "di MANA ADA".
Saya menambahkan ini hanya agar anda dapat melihat cara cepat untuk menulis 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
UPDATE dari PILIH dengan INNER JOIN dalam SQL Database
Karena ada terlalu banyak balasan dari posting ini, yang paling berat sampai-terpilih, saya pikir saya akan memberikan saran saya di sini juga. Meskipun pertanyaan ini sangat menarik, saya telah melihat di banyak situs forum dan membuat solusi dengan menggunakan INNER JOIN dengan screenshot.
Pada awalnya, saya telah membuat sebuah tabel yang bernama dengan schoolold dan dimasukkan beberapa catatan sehubungan dengan nama-nama kolom dan melaksanakannya.
Kemudian saya dieksekusi PILIH perintah untuk melihat dimasukkan catatan.
Kemudian saya membuat sebuah tabel baru bernama dengan schoolnew dan demikian pula dilaksanakan atas tindakan itu.
Kemudian, untuk melihat dimasukkan catatan di dalamnya, saya melaksanakan PILIH perintah.
Sekarang, di Sini saya ingin membuat beberapa perubahan dalam ketiga dan baris keempat, untuk menyelesaikan tindakan ini, saya melaksanakan UPDATE perintah dengan INNER JOIN.
Untuk melihat perubahan-perubahan yang saya jalankan PILIH perintah.
Anda dapat melihat bagaimana Ketiga dan Keempat catatan dari meja schoolold dengan mudah diganti dengan meja schoolnew dengan menggunakan INNER JOIN dengan MEMPERBARUI pernyataan.
Contoh berikut menggunakan tabel turunan, PILIH pernyataan setelah DARI klausa, untuk mengembalikan nilai lama dan baru untuk update 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
Dan jika anda ingin bergabung meja dengan dirinya sendiri (yang tidak't terjadi terlalu sering):
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
Memperbarui melalui CTE
lebih mudah dibaca daripada jawaban yang 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
Jika anda menggunakan SQL Server anda dapat memperbarui satu meja dari yang lain tanpa menentukan bergabung dan hanya menghubungkan dua dari where
. Hal ini membuat jauh lebih sederhana SQL query:
UPDATE Table1
SET Table1.col1 = Table2.col1,
Table1.col2 = Table2.col2
FROM
Table2
WHERE
Table1.id = Table2.id
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
Data sampel
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
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
Pastikan anda memperbarui apa yang anda inginkan, pilih dulu
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