2011-01-10 20 views
5

Código:BORRAR se unen a varias tablas

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; 

Básicamente, quiero borrar todos los registros en los que coltype y colsubtype no se menciona en los coltype y colsubtype tablas.

¿Cómo puedo hacer eso. El siguiente es el camino que estaba pensando tomar, pero no funciona, y no parece un buen diseño.

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

datos erróneos de ejemplo? Hace referencia a "typ2" como un "tipo de letra" en las inserciones de la tabla "colsubtype", pero no insertó ese valor en la tabla "coltype". –

Respuesta

2

seguirlo

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

su código tendrá que aprovechar el "no existe" operador muy fuertemente

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

Lo anterior funcionó bien, excepto que también debería haber eliminado todos los registros "typ3" también, lo que no sucedió. –

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

lo siento, debería ser un O no un AND. Lo he editado ahora – Dunc

8

Usando NO EXISTE:

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) 

Usando 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

Acabo de enterar/se me recordó que el primer 'from' es opcional. Uf –