Bagaimana cara menulis UPDATE SQL dengan Table alias di SQL Server 2008?

213

Saya memiliki yang sangat mendasar UPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

Query ini berjalan dengan baik di Oracle, Derby, MySQL- tapi gagal di SQL server 2008 dengan error berikut:

"Msg 102, Level 15, Status 1, Baris 1 Sintaks salah dekat 'Q'."

Jika saya menghapus semua kemunculan alias, "Q" dari SQL maka itu berfungsi.

Tapi saya perlu menggunakan alias.

javauser71
sumber
5
Mengapa Anda perlu menggunakan alias? Sepertinya Anda tidak membutuhkannya.
Mark Byers
5
Ya - dari perspektif pemrograman saya tidak membutuhkannya. Tapi saya punya / perpustakaan lama yang menghasilkan semua jenis DML SQL dengan alias tabel. Perpustakaan memiliki banyak kelas dengan semacam logika yang kompleks. Sekarang menyingkirkan alias tabel di perpustakaan lebih banyak pekerjaan daripada mengubah logika yang ada untuk bekerja untuk MSSQL. Juga ketika beberapa tabel terlibat, saya perlu memiliki tabel-alias.
javauser71

Jawaban:

422

Sintaks untuk menggunakan alias dalam pernyataan pembaruan pada SQL Server adalah sebagai berikut:

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

Alias ​​seharusnya tidak perlu di sini.

Mark Byers
sumber
2
Iya !!! Berhasil. Terima kasih atas tanggapan cepatnya. Kebetulan Anda tahu mengapa server MSSQL mendukung sintaksis yang tidak konvensional untuk pembaruan?
javauser71
3
Mark Byers - Jawaban Hebat !! Sintaks ini memungkinkan saya untuk menambahkan pernyataan Select yang dikomentari, yang memungkinkan saya untuk menguji pembaruan dengan melakukan pemilihan pertama (sorot dari pilih ke bawah dan jalankan):SET Q.TITLE = 'TEST' -- SELECT *
2
Bagus. Ini membuatnya lebih mudah untuk menggunakan intellisense di klausa mana.
Magnus
Itu bukan alias. Itu hanya nama 'table.column' yang sepenuhnya memenuhi syarat: - /
ScottWelker
18

Anda selalu dapat menggunakan pendekatan CTE , (Common Tabular Expression).

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';
Ryk
sumber
Ya - itu juga berfungsi. Tetapi untuk program JDBC / Java ini adalah semacam sintaks yang kompleks. Terimakasih atas tanggapan Anda.
javauser71
-1

Kasus khusus untuk Postgres

Daftar Solusi di atas tidak akan berfungsi Untuk saya. Jadi, inilah solusi untuk Postgres

Karena saya adalah api permintaan saya

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

Hasil: KESALAHAN: kolom "q" of relation "table" tidak ada

Solusi Anda tidak perlu menggunakan allis pada nilai data SET

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';
Ronak Patel
sumber
Halo Ronak, downvot jawaban Anda untuk Postgres dan sudah ada solusi untuk T-SQL di atas.
Alpi Murányi
hai @ AlpiMurányi dapatkah Anda menyarankan kepada saya apa solusi yang berfungsi dalam kasus saya. sehingga saya bisa menerapkan, Telah disebutkan Kesalahan dalam jawaban saya
Ronak Patel
Dear @Ronak, kasing Anda berbeda dari Poster Asli, oleh karena itu harus dibicarakan dalam komentar (bukan jawaban) atau diposting sebagai pertanyaan yang sama sekali baru.
Alpi Murányi