1

我有一个如下表(使用 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 的初学者,没有任何想法继续进行。任何帮助表示赞赏。

4

2 回答 2

2

我从 MSDN论坛得到了解决方案

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)
于 2012-12-02T17:51:00.717 回答
0

我会这样做:

  1. 将表重命名为 contacts_old(使用sp_rename
  2. 创建联系人表。
  3. 将 Contact1 = Contact2 的记录从 contacts_old 插入到联系人。
  4. 从contacts_old中删除Contact1 = Contact2的记录
  5. 现在我们留下了记录
    1. 联系人记录是唯一的,没有任何交换。您可以通过使用条件与 WHERE 子句 asLEFT INNER JOIN对同一表执行 a 来识别此类记录。插入联系人后,您可以删除这些记录。JOINc1.Contact1 = c2.Contact2 AND c1.Contact2 = c2.Contact1c2.Contact1 IS NULL
    2. 联系人列被交换并呈现。既然你有一些东西要开始,你可能想自己考虑一下。
于 2012-12-02T16:05:37.603 回答