T-SQL:从2行中删除1行,其中1列的值是第2行的两倍

时间:2015-06-05 09:11:01

标签: sql-server tsql

给出以下两行数据: -

ColumnA ColumnB ColumnC ColumnD
33 10298 11588 4474.32
33 10298 11588 2237.16

如何编写T-SQL查询,该查询只删除ColumnsA-C相同的第一个数据行,ColumnD中的值是第二个数据行的两倍。

它不需要特别高效,因为我只删除了大约500行。

2 个答案:

答案 0 :(得分:2)

这些方面应该有效:

DELETE FROM t2
FROM table t1
       inner join
     table t2
       on
          t1.ColumnA = t2.ColumnA and
          t1.ColumnB = t2.ColumnB and
          t1.ColumnC = t2.ColumnC and
          t1.ColumnD * 2 = t2.ColumnD

这假设如果您有3行,其columnD值之间的比率是1:2:4,则您要删除2行和4行。如果情况并非如此,请考虑这种情况,让我知道那里会发生什么。

DELETE documentation

完整的脚本:

create table T (A int,B int, C int, D int)
insert into T(A,B,C,D)
values (1,2,3,4),(1,2,3,8)

delete from t2
from t t1
    inner join
     t t2
        on
            t1.A = t2.A and t1.B = t2.B and t1.C = t2.C and t1.D * 2 = t2.D

select * from T

结果:

A           B           C           D
----------- ----------- ----------- -----------
1           2           3           4

答案 1 :(得分:1)

试试这个解决方案:

delete from YourTable
from YourTable t1
where exists (select 1 from YourTable t2 where t1.ColumnA=t2.ColumnA and t1.ColumnB=t2.ColumnB and t1.ColumnC=t2.ColumnC and t1.ColumnD=t2.ColumnD*2)

如果要从该表中删除,则不能在连接语句中使用同一个表两次。因此,使用istead join an exists语句或连接派生表。