2017-05-25 52 views
2

我想删除从select语句返回的表的行。删除从哪里存在(选择...)删除所有行

这是一个简化的例子,它不工作。

declare @t1 table(a int, b int, c int) 

insert into @t1(a,b,c) select 1, 10, 1 
insert into @t1(a,b,c) select 1, 5, 2 

select ta.a, ta.b, ta.c 
     from @t1 ta 
     join @t1 tb on ta.a = tb.a 
     where ta.c < tb.c 

delete from @t1 
where exists (select ta.a, ta.b, ta.c 
     from @t1 ta 
     join @t1 tb on ta.a = tb.a 
     where ta.c < tb.c) 

select * from @t1 

这里有输出,你可以看到选择只选择单一的行,但删除删除一切

results

+1

你内心的选择查询没有以任何方式连接到删除查询。 – litelite

+0

@litelite我只是用它来显示select中返回的行 – TagJones

回答

4

的问题是,你使用EXISTS的事实。

EXISTS只判断是否有结果可言的,因为你的语句返回的记录,你基本上说:DELETE @T1 WHERE (TRUE)

尝试使用这个:

Delete ta 
From @t1 ta 
Join @t1 tb On ta.a = tb.a 
Where ta.c < tb.c