Удалить с объединением в несколько таблиц - PullRequest
5 голосов
/ 10 января 2011

Код:

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;

По сути, я хочу удалить все записи, в которых coltype и colsubtype не упомянуты в таблицах coltype и colsubtype.

Как мне это сделать. Ниже приведен путь, по которому я думал, но он не работает - и - это не похоже на хороший дизайн.

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)

Ответы [ 4 ]

8 голосов
/ 10 января 2011

Использование NOT EXISTS:

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)

Использование левых соединений:

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
2 голосов
/ 10 января 2011

Попробуй

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 голосов
/ 10 января 2011
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 голосов
/ 10 января 2011

ваш код должен использовать оператор "не существует" довольно сильно

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
)
...