Saya perlu memperbarui tabel ini dalam SQL Server dengan data dari tabel 'induknya', lihat di bawah:
Meja: dijual
id (int)
udid (int)
assid (int)
Tabel: ud
id (int)
assid (int)
sale.assid
berisi nilai yang benar untuk diperbarui ud.assid
.
Permintaan apa yang akan melakukan ini? Saya sedang memikirkan join
tetapi saya tidak yakin apakah itu mungkin.
sql
sql-server
tsql
sql-server-2005
sql-update
Semut Swift
sumber
sumber
Jawaban:
Sintaks sangat tergantung pada SQL DBMS yang Anda gunakan. Berikut adalah beberapa cara untuk melakukannya di ANSI / ISO (alias harus bekerja pada SQL DBMS), MySQL, SQL Server, dan Oracle. Maklum bahwa metode ANSI / ISO saya yang disarankan biasanya akan jauh lebih lambat daripada dua metode lainnya, tetapi jika Anda menggunakan SQL DBMS selain MySQL, SQL Server, atau Oracle, maka itu mungkin satu-satunya cara untuk pergi (mis. jika SQL DBMS Anda tidak mendukung
MERGE
):ANSI / ISO:
MySQL:
SQL Server:
PostgreSQL:
Perhatikan bahwa tabel target tidak boleh diulang dalam
FROM
klausa untuk Postgres.Peramal:
SQLite:
sumber
set assid = s.assid
seharusnya MySQLset u.assid = s.assid
.=
pengembalian lebih dari satu baris?update ud set assid = s.assid
Ini harus bekerja di SQL Server:
sumber
postgres
sumber
Pendekatan SQL standar akan menjadi
Pada SQL Server Anda bisa menggunakan gabungan
sumber
WHERE
klausa jika Anda ingin mencocokkan pada kolom tambahan.PostgreSQL :
sumber
Permintaan pembaruan yang disederhanakan menggunakan BERGABUNG dengan beberapa tabel.
Catatan - first_table, second_table, third_table, dan some_column seperti 123456 adalah nama tabel demo, nama kolom dan id. Gantilah dengan nama yang valid.
sumber
Contoh lain mengapa SQL tidak benar-benar portabel.
Untuk MySQL adalah:
Untuk info lebih lanjut baca beberapa pembaruan tabel: http://dev.mysql.com/doc/refman/5.0/en/update.html
sumber
Teradata Aster menawarkan cara lain yang menarik bagaimana mencapai tujuan:
sumber
Saya berpikir SQL-Server yang ada di posisi atas akan bekerja untuk Sybase karena keduanya adalah T-SQL tetapi sayangnya tidak.
Untuk Sybase saya menemukan pembaruan harus di atas meja itu sendiri, bukan alias:
sumber
Pernyataan berikut dengan kata kunci FROM digunakan untuk memperbarui beberapa baris dengan gabungan
sumber
MySQL
Anda akan mendapatkan kinerja terbaik jika Anda lupa di mana klausa dan menempatkan semua kondisi dalam ekspresi ON.
Saya pikir ini karena permintaan pertama harus bergabung dengan tabel kemudian menjalankan klausa di mana itu, jadi jika Anda dapat mengurangi apa yang diperlukan untuk bergabung maka itulah cara berpuasa untuk mendapatkan hasil / melakukan udpate.
Contoh
Skenario
Anda memiliki tabel pengguna. Mereka dapat masuk menggunakan nama pengguna atau email atau nomor akun mereka. Akun-akun ini bisa aktif (1) atau tidak aktif (0). Tabel ini memiliki 50.000 baris
Anda kemudian memiliki tabel pengguna untuk menonaktifkan sekaligus karena Anda tahu mereka semua telah melakukan sesuatu yang buruk. Namun tabel ini, memiliki satu kolom dengan nama pengguna, email, dan nomor akun dicampur. Ini juga memiliki indikator "has_run" yang perlu diatur ke 1 (benar) ketika telah dijalankan
Pertanyaan
Pemikiran
Jika kita harus bergabung hanya pada kondisi ATAU itu pada dasarnya perlu memeriksa setiap baris 4 kali untuk melihat apakah harus bergabung, dan berpotensi menghasilkan lebih banyak baris. Namun, dengan memberikan lebih banyak persyaratan, ia dapat "melewati" banyak baris jika tidak memenuhi semua persyaratan saat bergabung.
Bonus
Ini lebih mudah dibaca. Semua kondisi di satu tempat dan baris untuk memperbarui ada di satu tempat
sumber
Dan di MS ACCESS:
sumber
Cara paling sederhana adalah dengan menggunakan Common Table Expression (CTE) yang diperkenalkan pada SQL 2005
sumber
sumber
Coba yang ini, saya pikir ini akan bekerja untuk Anda
sumber
Untuk SQLite gunakan properti RowID untuk membuat pembaruan:
sumber