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.