2013-02-10 21 views
12

Tôi có Bảng A với các giá trị sau:Xóa dòng từ bảng nơi trận tồn tại trong bảng thứ hai

  
+------+------+ 
| ID1 | ID2 | 
+------+------+ 
| 1689 | 1709 | 
| 1709 | 1689 | 
| 1782 | 1709 | 
| 1911 | 1247 | 
| 1247 | 1468 | 
| 1641 | 1468 | 
| 1316 | 1304 | 
| 1501 | 1934 | 
| 1934 | 1501 | 
| 1025 | 1101 | 
+------+------+ 

và một mối quan hệ (bảng B) với các giá trị sau:

 
+------+------+ 
| ID1 | ID2 | 
+------+------+ 
| 1641 | 1468 | 
| 1911 | 1247 | 
+------+------+ 

tôi sẽ muốn xóa tất cả các hàng trong Bảng A xuất hiện trong Bảng B (đối sánh chính xác trên ID1 và ID2). Có vẻ đơn giản trong lý thuyết nhưng tôi không có niềm vui với câu lệnh EXISTS hoặc các cách tiếp cận khác. Tôi đang sử dụng SQLite.

Bất kỳ đề xuất nào được đánh giá cao.

Trả lời

21

Làm thế nào về: (không quá chắc chắn cho dù công trình này trong SQLite)

DELETE FROM TableA 
WHERE EXISTS (SELECT * 
       FROM TableB 
       WHERE TableB.ID1 = TableA.ID1 
       AND TableB.ID2 = TableA.ID2) 
+7

Tôi thấy cú pháp này của SQL cực kỳ phức tạp. Nếu TableA và TableB là cùng một Bảng, thì tôi phải sử dụng 'TableA' để tham chiếu đến bảng trong mệnh đề xóa, và tôi không có cách nào để cho nó một tên bí danh; ngược lại, tôi phải đặt tên bí danh cho bảng trong truy vấn phụ và không có cách nào để sử dụng 'id1' và 'id2' không có tên bảng tiền tố ... –

+1

Thử sử dụng CTE để chọn tùy chọn –

0

Trong MSSQL bạn có thể làm điều này: (hiệu quả nhất)

DELETE một TỪ một THAM GIA b ON a. ID1 = b.ID1 VÀ a.ID2 = b.ID2

-1
DELETE a FROM TableA a INNER JOIN TableB b ON a.ID1=b.ID1 AND a.ID2=b.ID2 
Các vấn đề liên quan