เหตุใดฉันไม่สามารถใช้ชื่อแทนในคำสั่ง DELETE ได้


158

ใน SQL Server Compact Edition ใน Visual Studio 2010 (อาจเป็น SQL Server และ SQL โดยทั่วไปฉันไม่รู้) คำสั่งนี้ใช้งานได้:

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

แต่คำสั่งนี้สร้างข้อผิดพลาดของ: Error near identifier f. Expecting OUTPUT.

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

@ aaron-bertrand ขอบคุณสำหรับการแก้ไขชื่อของฉันด้วย ฉันไม่ได้ตระหนักถึงคำที่ถูกต้องสำหรับสิ่งที่ฉันโพสต์ (มิฉะนั้น google อาจแก้ไขได้อย่างรวดเร็ว) ขอขอบคุณอีกครั้ง.
Ricardo Altamirano

ไม่ต้องห่วง. แค่พยายามทำให้ชัดเจนสำหรับผู้อ่านคนอื่น ๆ
Aaron Bertrand

ฉันเห็นด้วยกับคุณด้วยวิธีการที่รูปแบบไวยากรณ์ที่แตกต่างกันระหว่างคำสั่งที่แตกต่างกันเล็กน้อยในบางครั้ง
Aaron Bertrand

นี่คือคำถามเดียวกัน แต่สำหรับคำสั่ง UPDATE: stackoverflow.com/questions/31551/…
Daniel Neel

คำตอบ:


239

ในการตั้งชื่อแทนตารางคุณจะต้องพูดว่า:

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

ฉันไม่เห็นจุดของนามแฝงสำหรับข้อความเฉพาะDELETEนี้โดยเฉพาะอย่างยิ่งเนื่องจาก (อย่างน้อย IIRC) สิ่งนี้ไม่สอดคล้องกับ ANSI ที่เข้มงวดอีกต่อไป แต่ใช่ตามความเห็นแนะนำอาจมีความจำเป็นสำหรับรูปแบบแบบสอบถามอื่น ๆ (เช่นความสัมพันธ์)


2
ฉันแค่อยากรู้อยากเห็นเป็นส่วนใหญ่เพราะปกติฉันจะใช้นามแฝงเมื่อใช้SELECTและคำสั่งอื่น ๆ ดังนั้นฉันจึงทำสิ่งที่ฉันคุ้นเคยและสงสัยว่าทำไมมันไม่ทำงานอย่างถูกต้อง
Ricardo Altamirano

41
+1 ในกรณีของ OP ไม่จำเป็นต้องใช้นามแฝง แต่เป็นประโยชน์กับฉันเพราะฉันใช้ประโยค EXISTS ดังนั้นฉันต้องใช้นามแฝงตารางเพื่อที่ฉันจะสามารถสืบค้นทั้งคู่ได้
Ricardo

4
ฉันกำลังหาวิธีแก้ปัญหาเมื่อรับคิวรี SELECT ที่มีอยู่และเปลี่ยนเป็นคำสั่ง DELETE อย่างรวดเร็วโดยไม่ต้องเขียนนามแฝงใหม่
อเล็กซ์

4
ตัวอย่างกรณีการใช้งานซึ่งเป็นสิ่งสำคัญ การลบตามเนื้อหาของตารางที่สองที่มีหลายคอลัมน์ที่เกี่ยวข้อง (เช่นนั้นinหรือnot inไม่ทำงาน: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
การลบด้วยนามแฝงมีประโยชน์เมื่อคุณต้องการลบจากตาราง แต่จำเป็นต้องเข้าร่วมตารางนั้นกับตาราง / มุมมองอื่น ๆ เพื่อรับชุดของแถวที่ลดลง เช่นdelete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens

74

คำสั่งลบมีไวยากรณ์ที่แปลก มันจะเป็นเช่นนี้:

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

1
@Ricardo แตกต่างเพียงอย่างเดียวคือสคีมา แต่เวลาแนะนำให้ทั้งสองโพสต์ในเวลาเดียวกัน
Mukus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.