Tại sao tôi không thể sử dụng bí danh trong câu lệnh XÓA?


158

Trong SQL Server Compact Edition trong Visual Studio 2010 (có thể nói chung là SQL Server và SQL, tôi không biết), lệnh này hoạt động:

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

nhưng lệnh này tạo ra lỗi: Error near identifier f. Expecting OUTPUT.

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

@ aaron-bertrand Cảm ơn vì đã sửa tiêu đề của tôi. Tôi đã không nhận ra thuật ngữ chính xác cho những gì tôi đã đăng (nếu không google có thể giải quyết vấn đề này một cách nhanh chóng). Cám ơn bạn một lần nữa.
Ricardo Altamirano

Đừng lo lắng. Chỉ cố gắng để làm cho nó rõ ràng cho các độc giả khác.
Aaron Bertrand

Tôi đồng ý với bạn bởi cách mà các cú pháp biến đổi giữa các lệnh khác nhau đôi khi không trực quan.
Aaron Bertrand

Đây là câu hỏi tương tự, nhưng đối với các câu lệnh CẬP NHẬT: stackoverflow.com/questions/31551/ Kẻ
Daniel Neel

Câu trả lời:


239

Để bí danh bảng bạn phải nói:

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

Tôi không thấy quan điểm của bí danh cho DELETEtuyên bố cụ thể này , đặc biệt là vì (ít nhất là IIRC), điều này không còn phù hợp với ANSI nghiêm ngặt. Nhưng có, như ý kiến ​​đề xuất, có thể cần thiết cho các hình thức truy vấn khác (ví dụ: tương quan).


2
Tôi chủ yếu chỉ tò mò, vì tôi thường sử dụng bí danh khi sử dụng SELECTvà các tuyên bố như vậy, vì vậy tôi theo bản năng đã làm những gì tôi đã quen và tự hỏi tại sao nó không hoạt động đúng.
Ricardo Altamirano

41
+1 Trong trường hợp của OP, có thể không cần đặt bí danh, nhưng nó rất hữu ích với tôi vì tôi đang sử dụng mệnh đề EXISTS, vì vậy tôi phải đặt bí danh cho bảng để tôi có thể kết hợp cả hai truy vấn với nhau.
Ricardo

4
Tôi đã tìm kiếm một giải pháp khi thực hiện một truy vấn CHỌN hiện có và nhanh chóng biến nó thành một câu lệnh XÓA mà không phải viết lại bí danh.
Alex

4
Ví dụ về trường hợp sử dụng trong đó điều này là quan trọng; xóa dựa trên nội dung của bảng thứ hai có nhiều cột liên quan (nghĩa là có inhoặc not inkhông hoạt động: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
Việc xóa bằng bí danh rất hữu ích khi bạn muốn xóa khỏi một bảng nhưng cần nối bảng đó với các bảng / khung nhìn khác để có được một tập hợp các hàng giảm. Ví dụ:delete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens

74

Câu lệnh xóa có cú pháp lạ. Nó như thế này:

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

1
@Ricardo chỉ khác là lược đồ. Nhưng thời gian cho thấy cả hai đã được đăng cùng một lúc.
Mukus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.