T-SQL使用交叉应用删除语句

时间:2012-10-23 09:35:24

标签: tsql sql-server-2012 cross-apply

我有以下表格:

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做得更聪明,更清洁?

2 个答案:

答案 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