【问题标题】:Delete records from table where a = b and b = a从表中删除 a = b 和 b = a 的记录
【发布时间】:2013-03-13 15:31:44
【问题描述】:

我有一个包含两个字段 a 和 b 的表。有些记录在 a = b 和 b = a 的意义上是重复的。我想删除这些记录。

考虑一下:

declare @temp table (a int, b int)

insert into @temp values (1, 2)
insert into @temp values (3, 4)
insert into @temp values (4, 3)
insert into @temp values (5, 6)

--delete 3, 4 or 4, 3

select * from @temp

/*
a | b
--|--
1 | 2
3 | 4
5 | 6

or (I don't care which one)

a | b
--|--
1 | 2
4 | 3
5 | 6
*/

我怎样才能做到这一点?它需要支持 Microsoft SQL Server 2000 及更高版本。

【问题讨论】:

    标签: sql sql-server sql-delete


    【解决方案1】:
    DELETE  x
    FROM    TableName x
            INNER JOIN
            (
              SELECT  a.A, a.B
              FROM    tableName a
                      INNER JOIN tableName b
                          ON ((a.A = b.A AND a.b = b.b) OR
                              (a.A = b.B AND a.b = b.A)) AND 
                             a.a > b.a
            ) y ON x.A = y.A AND x.B = y.B
    

    【讨论】:

    • +1,不得不说,经典的重复删除策略。伙计,我以前在桌子上使用过这个,因为我的同行认为唯一约束太荒谬了!
    【解决方案2】:

    这是较新版本的 SQL Server 的解决方案

    declare @temp table (a int, b int)
    
    insert into @temp values (1, 2)
    insert into @temp values (3, 4)
    insert into @temp values (4, 3)
    insert into @temp values (5, 6)
    insert into @temp values (6, 5)
    --delete 3, 4 or 4, 3
    
    
    delete t3
    --select * 
    from 
    (select t1.a, t1.b,rank() over (partition by t2.a +t2.b order by t1.a) as row_number from @temp t1
    join @temp t2 on t2.a = t1.b and t2.b = t1.a)c
    join @temp t3 on c.a =t3.a and c.b = t3.b
    where c.row_number <>1
    
    select * from @temp
    

    发布只是为了向正在搜索相同内容的其他人展示更新的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2014-03-29
      • 2011-12-23
      • 2021-10-06
      相关资源
      最近更新 更多