从表中删除重复的条目

时间:2012-12-02 15:47:27

标签: sql sql-server sql-server-2008 tsql

我有一个如下表(使用MS SQL server 2008)

Contact1    Contact2
--------    ---------
1234567890  9087654321
9087654321  1234567890
1234567890  1234567890
9087654321  9087654321
8989898989  9898989898
9898989898  8989898989

第2行和第5行中的Contact1和Contact2的值分别是第1行和第6行中值的交换形式。这两个值在第3和第4行都相等。

由于有几个虚假条目,我需要删除它们。结果表看起来像 -

Contact1    Contact2
--------    ---------
1234567890  9087654321
8989898989  9898989898

我是SQL的初学者,没有任何想法继续下去。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

我从MSDN获得了解决方案Forum

WITH swapped_Contacts AS (
     SELECT
        CASE WHEN Contact1 <= Contact2 THEN Contact1 ELSE Contact2 END AS Contact1
        ,CASE WHEN Contact2 > Contact1 THEN Contact2 ELSE Contact1 END AS Contact2
    FROM dbo.Contacts
)
,ordered_Contacts AS (
    SELECT 
        Contact1
        , Contact2
        , ROW_NUMBER() OVER(PARTITION BY Contact1, Contact2 ORDER BY Contact1, Contact2) AS rownum
    FROM swapped_Contacts
    )
DELETE
FROM ordered_Contacts
WHERE 
rownum > 1


DELETE Contacts
FROM   Contacts C1
WHERE  Contact1 = Contact2
AND   EXISTS (SELECT *
          FROM   Contacts C2
          WHERE  C1.Contact1 IN (C2.Contact1, C2.Contact2) 
            AND  C2.Contact1 <> C2.Contact2)

答案 1 :(得分:0)

我会这样做:

  1. 将表重命名为contacts_old(使用sp_rename
  2. 创建联系人表格。
  3. 将来自contacts_old的Contact1 = Contact2的记录插入联系人。
  4. 从contacts_old
  5. 删除Contact1 = Contact2的记录
  6. 现在我们留下了记录
    1. 联系人记录是唯一的,无需任何交换。您可以通过LEFT INNER JOIN在同一个表上执行JOIN来识别此类记录,c1.Contact1 = c2.Contact2 AND c1.Contact2 = c2.Contact1条件为c2.Contact1 IS NULL,WHERE子句为{{1}}。插入联系人后,您可以删除这些记录。
    2. 交换列并显示联系人列。你可能想要自己考虑一下,因为你有一些事情可以开始。