2017-05-25 105 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