2011-01-10 15 views
5

Kod:Usuń z przyłączenia się do wielu tabel

create table coltype (coltype varchar(5)); 

insert into coltype values ('typ1'); 

create table colsubtype (coltype varchar(5), colsubtype varchar(5)); 

insert into colsubtype values ('typ2', 'st1'); 
insert into colsubtype values ('typ2', 'st2'); 

create table table1 (col1 varchar(5), coltype varchar(5), colsubtype varchar(5)); 

insert into table1 values ('val1','typ1', 'st1'); 
insert into table1 values ('val2','typ1', 'st2'); 
insert into table1 values ('val3','typ1', 'st3'); 
insert into table1 values ('val4','typ2', 'st1'); 
insert into table1 values ('val5','typ2', 'st2'); 
insert into table1 values ('val6','typ2', 'st3'); 
insert into table1 values ('val7','typ3', 'st1'); 
insert into table1 values ('val8','typ3', 'st2'); 
insert into table1 values ('val9','typ3', 'st3'); 

commit; 

Zasadniczo, chcę usunąć wszystkie rekordy, gdzie coltype i colsubtype nie jest wymieniona w coltype i colsubtype tabelach.

Jak to zrobić? Poniżej znajduje się ścieżka, którą rozważałem, ale nie działa - i - nie wygląda na dobry projekt.

delete from table1 
where coltype != (select coltype from coltype) 
    OR not (coltype = cst.coltype and colsubtype = cst.colsubtype 
from (select coltype, colsubtype from colsubtype) cst) 
+0

Złe dane próbki? Odwołujesz się do "typ2" jako 'coltype' w insertach do tabeli' colsubtype', ale nie wstawiłeś tej wartości do tabeli 'coltype'. –

Odpowiedz

2

Spróbuj wypróbować

delete from table1 
where not exists 
     (
     select * 
     from coltype 
     where table1.coltype = coltype.coltype 
     ) 
    and not exists 
     (
     select * 
     from colsubtype 
     where table1.coltype = colsubtype.coltype 
      and table1.colsubtype = colsubtype.colsubtype 
     ) 
0

kod będzie trzeba maksymalnie wykorzystać "nie istnieje" operator dość mocno

delete from table1 
where not exists 
(
    select 1 from colType ct where ct.colType = table1.colType 
) 
and not exists 
(
    select 1 from colsubtype cst where cst .colSubType = table1.colSubType 
) 
+0

Powyższe zadziałało dobrze, poza tym, że powinno również usunąć wszystkie rekordy "typ3" - które nie zostały usunięte. –

0
DELETE FROM table1 
WHERE coltype IN 
(SELECT coltype 
FROM table1 
WHERE coltype NOT IN (SELECT coltype FROM coltype)) 
OR colsubtype IN 
(SELECT colsubtype 
FROM table1 
WHERE colsubtype NOT IN (SELECT colsubtype FROM colsubtype)) 
+0

Przepraszam, że powinno to być OR, a nie AND. Edytowałem to teraz – Dunc

8

Korzystanie NIE ISTNIEJE:

delete from t1 
    from table1 t1 
    where not exists (select null from coltype ct where ct.coltype = t1.coltype) 
     or not exists (select null from colsubtype cst where cst.colsubtype = t1.colsubtype) 

Korzystanie LEFT JOIN:

delete from t1 
    from table1 t1 
     left join coltype ct 
      on t1.coltype = ct.coltype 
     left join colsubtype cst 
      on t1.colsubtype = cst.colsubtype 
    where ct.coltype is null 
     or cst.colsubtype is null 
+0

Po prostu się dowiedział/przypomniał, że pierwsze 'od' jest opcjonalne. Uff –

Powiązane problemy