2

我有以下表格:

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 更聪明、更清洁?

4

2 回答 2

3

我在这里没有看到使用 cross apply 的任何优势。这是一个完成这项工作的简单解决方案:

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
于 2012-10-23T10:56:44.960 回答
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
于 2012-10-23T11:06:49.097 回答