Mengapa saya tidak bisa menggunakan alias dalam pernyataan DELETE?

158

Dalam SQL Server Compact Edition di Visual Studio 2010 (mungkin SQL Server dan SQL secara umum, saya tidak tahu), perintah ini berfungsi:

DELETE FROM foods WHERE (name IN ('chickens', 'rabbits'))

tetapi perintah ini menghasilkan kesalahan: Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
Ricardo Altamirano
sumber
@ aaron-bertrand Terima kasih telah memperbaiki judul saya juga. Saya tidak menyadari istilah yang tepat untuk apa yang saya posting (jika tidak, google bisa menyelesaikan ini dengan cepat). Terima kasih lagi.
Ricardo Altamirano
Jangan khawatir. Hanya berusaha memperjelas bagi pembaca lain.
Aaron Bertrand
Saya setuju dengan Anda dengan cara bahwa variasi sintaksis di antara berbagai perintah agak sedikit tidak intuitif.
Aaron Bertrand
Ini pertanyaan yang sama, tetapi untuk pernyataan UPDATE: stackoverflow.com/questions/31551/…
Daniel Neel

Jawaban:

239

Untuk alias tabel, Anda harus mengatakan:

DELETE f FROM dbo.foods AS f WHERE f.name IN (...);

Saya gagal melihat titik aliasing untuk DELETEpernyataan spesifik ini , terutama karena (setidaknya IIRC) ini tidak lagi sesuai dengan ANSI yang ketat. Tapi ya, seperti komentar menyarankan, mungkin diperlukan untuk formulir permintaan lain (misalnya korelasi).

Aaron Bertrand
sumber
2
Saya terutama hanya ingin tahu, karena saya biasanya menggunakan alias ketika menggunakan SELECTdan pernyataan lainnya, jadi saya secara naluriah melakukan apa yang saya terbiasa dan bertanya-tanya mengapa itu tidak berfungsi dengan baik.
Ricardo Altamirano
41
+1 Dalam kasus OP, aliasing mungkin tidak diperlukan, tapi itu membantu saya karena saya menggunakan klausa EXIS, jadi saya harus menamai tabel sehingga saya bisa menyatukan kedua kueri.
Ricardo
4
Saya sedang mencari solusi ketika mengambil query SELECT yang ada dan mengubahnya menjadi pernyataan DELETE dengan cepat tanpa harus menulis ulang alias.
Alex
4
Contoh use case di mana ini penting; menghapus berdasarkan pada isi dari tabel kedua di mana ada beberapa kolom yang terlibat (yaitu begitu inataunot in tidak berfungsi:DELETE f from dbo.foods as f where not exists (select top 1 1 from animalDiets a where a.AnimalId = f.AnimalId and a.DietId = f.DietId)
JohnLBevan
3
Hapus dengan alias berguna ketika Anda ingin menghapus dari suatu tabel tetapi perlu menggabungkan tabel itu ke tabel / tampilan lain untuk mendapatkan set baris yang dikurangi. Misalnyadelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens
74

Pernyataan delete memiliki sintaks aneh. Bunyinya seperti ini:

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))
usr
sumber
1
@Ricardo satu-satunya perbedaan adalah skema. Tetapi waktu menunjukkan keduanya diposting pada waktu yang sama.
Mukus