我有一个如下表(使用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的初学者,没有任何想法继续下去。任何帮助表示赞赏。
答案 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)
我会这样做:
sp_rename
)LEFT INNER JOIN
在同一个表上执行JOIN
来识别此类记录,c1.Contact1 = c2.Contact2 AND c1.Contact2 = c2.Contact1
条件为c2.Contact1 IS NULL
,WHERE子句为{{1}}。插入联系人后,您可以删除这些记录。