我有以下表格:
RecordID
101
102
103
104
105
106
TableOne
101
102
103
104
TableTwo
TableThree
101
102
我需要删除其他表中未包含的RecordsID行。请注意,有时表TableOne,TableTwo,TableThree中的一个表可能为空,因此不应删除任何记录。
结果表应为:
RecordID
101
102
由于空表,我无法使用INNER JOIN。因为我在函数中使用这些代码,所以我无法生成只包含带记录的表并执行它的动态SQL语句。
我可以使用IF语句,但在我的实际情况中,我有很多情况要检查,许多表要加入,结果会导致很多代码重复。
这就是为什么我开始怀疑有没有办法通过CROSS APPLY做得更聪明,更清洁?
答案 0 :(得分:3)
我认为在这里使用交叉申请没有任何优势。这是一个简单的解决方案:
declare @t table(recordid int)
declare @tableone table(recordid int)
declare @tabletwo table(recordid int)
declare @tablethree table(recordid int)
insert @t values(101),(102),(103),(104),(105),(106)
insert @tableone values(101),(102),(103),(104)
insert @tablethree values(101),(102)
delete t
from @t t
where not exists (select 1 from @tableone where t.recordid = recordid)
and exists (select 1 from @tableone)
or not exists (select 1 from @tabletwo where t.recordid = recordid)
and exists (select 1 from @tabletwo)
or not exists (select 1 from @tablethree where t.recordid = recordid)
and exists (select 1 from @tablethree)
结果:
recordid
101
102
答案 1 :(得分:0)
使用Except和Union
declare @t table(recordid int)
declare @tableone table(recordid int)
declare @tabletwo table(recordid int)
declare @tablethree table(recordid int)
insert @t values(101),(102),(103),(104),(105),(106)
insert @tableone values(101),(102),(103),(104)
insert @tablethree values(101),(102)
delete
from @t where recordid not in(
select * from @t
except select * from
(select * from @tableone union
select * from @tabletwo union
select * from @tablethree)x)
select * from @t
recordid
105
106