2009-12-08 40 views
8

Cant dường như tập luyện những gì im làm sai ở đâyVấn đề xóa hàng sử dụng bên ngoài trái tham gia trong mysql

SELECT * FROM tbl_imagelabel LEFT OUTER JOIN tbl_image ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL

cho thấy các hàng chính xác tôi muốn xóa. nhưng nếu tôi thay đổi SELECT * FROM tới DELETE FROM nó không làm việc

DELETE FROM tbl_imagelabel LEFT OUTER JOIN tbl_image ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL

+0

Có thông báo lỗi không? – Bobby

+0

Chạy 'EXPLAIN EXTENDED' trước truy vấn' DELETE' và dán kết quả vào đây. –

Trả lời

10

Bạn đang cố gắng xóa từ nhiều bảng trong một truy vấn duy nhất với cú pháp đó. Hãy thử một cái gì đó giống như (và điều này chỉ là một ví dụ lỏng lẻo, không có nghĩa là để được tối ưu hóa hoặc bất cứ điều gì):

DELETE FROM tbl_imagelabel 
WHERE label_id IN (
    SELECT tbl_imagelabel.label_id 
    FROM tbl_imagelabel 
    LEFT OUTER JOIN tbl_image 
     ON tbl_imagelabel.label_id = tbl_image.label_id 
    WHERE tbl_image.label_id IS NULL 
) 
+0

34 giây tạo tất cả sự khác biệt :-) – cdonner

+0

LoL ... Tôi biết ... 1 cho giải pháp theo cách: D –

+0

vui lòng trả lại ưu tiên :-) – cdonner

4
DELETE FROM tbl_imagelabel 
where label_id IN 
(
SELECT tbl_imagelabel.label_id FROM tbl_imagelabel 
LEFT OUTER JOIN tbl_image 
ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL 
) 

giả label_id đó là khóa chính độc đáo.

6

Tôi tin rằng điều này thực hiện tương tự mà không cần tham gia rõ ràng.

DELETE FROM tbl_imagelabel 
WHERE label_id NOT IN (SELECT label_id FROM tbl_image) 
+0

+1 bắt tốt! (dang 15 giới hạn char về nhận xét) –

3

Trong khi tất cả các câu trả lời được đưa ra ở đây không bao gồm cả việc kết nối bên ngoài bên trái một cách rõ ràng trong tuyên bố xóa. Để làm điều đó, bạn cần có 'SỬ DỤNG' tuyên bố như sau:

DELETE FROM til USING tbl_imagelabel as til LEFT OUTER JOIN tbl_image as ti 
ON til.label_id = ti.label_id WHERE ti.label_id is NULL 

Tài liệu tham khảo:

8

Để tham khảo thêm tác, trên MySQL 5 +:

DELETE tbl1.* FROM tbl1 LEFT JOIN tbl2 USING(fld) WHERE tbl2.fld IS NULL; 

Nó sẽ xóa mọi orph ans trên TBL1 sử dụng fld là tham gia.

GL Paulo Bueno

Các vấn đề liên quan