Neden diğer adı DELETE deyiminde kullanamıyorum?


158

Visual Studio 2010'daki SQL Server Compact Edition'da (belki de genel olarak SQL Server ve SQL, bilmiyorum), bu komut çalışır:

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

ancak bu komut şu hatayı üretir: Error near identifier f. Expecting OUTPUT.

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

@ aaron-bertrand Başlığımı da düzelttiğiniz için teşekkürler. Gönderdiğim şey için doğru terimi fark etmedim (aksi takdirde google bunu hızlı bir şekilde çözebilirdi). Tekrar teşekkürler.
— Ricardo Altamirano

Telaşa gerek yok. Sadece diğer okuyucular için anlaşılır kılmaya çalışıyorum.
— Aaron Bertrand

Farklı komutlar arasındaki sözdizimi varyasyonlarının zaman zaman biraz sezgisel olmadığı konusunda size katılıyorum.
— Aaron Bertrand

İşte aynı soru, ancak UPDATE ifadeleri için: stackoverflow.com/questions/31551/…
— Daniel Neel

Yanıtlar:


239

Tablonun takma adını söylemek için:

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

DELETEÖzellikle (en azından IIRC) bu artık sıkı ANSI ile uyumlu olmadığından, bu özel ifade için diğer adın takılma noktasını göremiyorum . Ancak evet, yorumların da belirttiği gibi, diğer sorgu formları (örneğin korelasyon) için gerekli olabilir.


2
Esasen sadece merak ediyordum, çünkü normalde takma isimler SELECTve diğer ifadeleri kullanıyorum, bu yüzden alıştığım şeyi içgüdüsel olarak yaptım ve neden düzgün çalışmadığını merak ediyordum.
— Ricardo Altamirano

41
+1 OP'nin durumunda, takma ad gerekli olmayabilir, ancak EXISTS yantümcesini kullandığım için bana yardımcı oldu, bu yüzden her iki sorguyu birbirine bağlayabilmem için tabloyu takma adım vardı.
— Ricardo

4
Varolan bir SELECT sorgusu alarak ve diğer adı yeniden yazmak zorunda kalmadan hızla bir DELETE deyimi açarken bir çözüm arıyordu.
— Alex

4
Bunun önemli olduğu kullanım örneği; birden fazla sütunun bulunduğu ikinci bir tablonun içeriğine göre silme (yani, inya not inda çalışmaz: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
Bir takma adla silme, bir tablodan silmek istediğinizde, ancak daha düşük bir satır kümesi elde etmek için bu tabloyu diğer tablolara / görünümlere eklemeniz gerektiğinde yararlıdır. Ör.delete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
— Andrew Jens

74

Delete deyiminin tuhaf bir sözdizimi var. Bu böyle devam ediyor:

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

1
@Ricardo tek fark şemadır. Ancak zaman, her ikisinin de aynı zamanda yayınlandığını gösteriyor.
— Mukus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.