从存在的地方删除(选择...)删除所有行

时间:2017-05-25 12:45:57

标签: sql

我想删除从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

以下是输出,您可以看到select只选择一行,但删除删除所有内容

results

1 个答案:

答案 0 :(得分: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