2013-02-10 11 views
12

mam Tabela A z następujących wartości:usunąć wiersza z tabeli, w której istnieje wartość w drugiej tabeli

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

i drugi wzór (Tabela B) z następującymi wartościami:

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

bym jak usunąć wszystkie wiersze w Tabeli A, które pojawiają się w Tabeli B (dokładne dopasowanie na ID1 i ID2). Wydaje się proste w teorii, ale nie mam żadnej radości z instrukcji EXISTS lub innych podejść. Używam SQLite.

Wszelkie sugestie bardzo doceniane.

Odpowiedz

21

Jak o: (nie jestem pewien czy to działa w SQLite)

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

Uważam, że ta składnia SQL jest niezwykle trudna. Jeśli TableA i TableB to ta sama tabela, to muszę użyć "TableA", aby odwołać się do tabeli w klauzuli delete i nie mam możliwości nadania jej nazwy aliasu; przeciwnie, muszę podać nazwę aliasu do tabeli w pod-zapytaniu i nie mam możliwości użycia "id1" i "id2" bez nazwy tabeli prefiksów ... –

+1

Spróbuj użyć CTE dla podselekcji –

0

W MSSQL można to zrobić: (najbardziej wydajne)

usunąć od A JOIN b ON a. ID1 = b.ID1 ORAZ a.ID2 = b.ID2

-1
DELETE a FROM TableA a INNER JOIN TableB b ON a.ID1=b.ID1 AND a.ID2=b.ID2 
Powiązane problemy