2011-01-10 5 views
5

Code:Löschen verbinden mit, um mehrere Tabellen

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; 

Grundsätzlich möchte ich alle Datensätze löschen, wo die coltype und colsubtype nicht in den coltype und colsubtype Tabellen erwähnt.

Wie mache ich das? Das Unten ist der Weg, den ich mir vorgestellt habe, aber es funktioniert nicht - und - es scheint kein gutes Design zu sein.

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

Falsche Beispieldaten? Sie referenzieren "typ2" als "coltype" in den Einfügungen in die "colsubtitype" -Tabelle, aber Sie haben diesen Wert nicht in die "coltype" -Tabelle eingefügt. –

Antwort

2

Probieren Sie dieses aus

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

Ihr Code muss der Betreiber

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

Das obige funktionierte gut, außer dass es auch alle "typ3" Aufzeichnungen gelöscht haben sollte - was es nicht tat. –

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

Entschuldigung, das sollte ein ODER nicht ein UND sein. Ich habe es jetzt bearbeitet – Dunc

8

Mit NICHT VORHANDEN ziemlich stark "nicht vorhanden" nutzen:

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) 

Mit 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

Gerade herausgefunden/wurde daran erinnert, dass das erste 'von' optional ist. Puh –