Nee*_*elp 5 sql-server join sql-delete
码:
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;
Run Code Online (Sandbox Code Playgroud)
基本上,我想删除和表中提及coltype和colsubtype未提及的所有记录.coltypecolsubtype
我怎么做.以下是我想要采取的路径,但它不起作用 - 而且 - 它似乎不是一个好的设计.
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)
Run Code Online (Sandbox Code Playgroud)
使用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)
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
尝试一下
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
)
Run Code Online (Sandbox Code Playgroud)