2013-02-01 89 views
1

我需要一个脚本来查找有多个朋友连接的会员,因此它不会在网站上多次显示他们的友谊。在SQL Server中查找并删除重复的朋友连接

的MemberConnection表如下:

+----------------------+------------+----------------+ 
| MemberConnectionID | MemberID | ConnMemberID | 
+----------------------+------------+----------------+ 
| 25     | 33  | 43    | 
| 26     | 43  | 33    | 
| 27     | 13  | 143   | 
| 28     | 143  | 13    | 
| 29     | 33  | 43    | 
+----------------------+------------+----------------+ 

正如你可以看到行25和29是相同的,我需要找到这些重复这样他们就可以被删除。

如何为此编写脚本?

任何人都可以提供的帮助将不胜感激。

提前

neojakey

+0

你想同时删除它吗? –

+1

是否要删除一行或两行?另外,你有什么尝试? – LukeHennerley

+2

你如何在'MemberID,ConnMemberID'上创建'UNIQUE'约束? – Kermit

回答

3

,如果你要离开一个连接试试这个:

使用此功能选择连接:

;WITH CTE 
AS 
(
    SELECT 
     MemberConnectionID, 
     ROW_NUMBER() OVER (PARTITION BY MemberID, ConnMemberID ORDER BY MemberConnectionID) RN 
    FROM MemberConnection 
) 
SELECT 
     MemberConnectionID 
FROM CTE 
WHERE RN > 1 

或使用该从表中删除:

;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY MemberID, ConnMemberID ORDER BY MemberConnectionID) RN 
    FROM MemberConnection 
) 
DELETE 
FROM CTE 
WHERE RN > 1 
+0

非常感谢这个脚本工作出色.. +1为你.. – neojakey

0

非常感谢你可以这样做:

SELECT * FROM 
(SELECT MemberID,ConnMemberID ,count(MemberID,ConnMemberID) as c FROM MemberConnection group by MemberID,ConnMemberID) x 
WHERE x.c >1 

这将显示所有的重复行。

0

以此为测试:

DECLARE @Table AS TABLE 
    (
     MemberConnectionID INT , 
     MemberID INT , 
     ConMemberID INT 
    ) 

INSERT INTO @Table 
     SELECT 1 , 
       2 , 
       3 
INSERT INTO @Table 
     SELECT 2 , 
       3 , 
       4 
INSERT INTO @Table 
     SELECT 3 , 
       2 , 
       3 

成员连接

SELECT COUNT(MemberConnectionID) AS Occurence , 
      MemberID , 
      ConMemberID 
FROM  @Table 
GROUP BY MemberID , 
      ConMemberID 

DELETE语句的选择occurence

DELETE FROM @Table 
FROM @Table t 
     INNER JOIN (SELECT MemberID , 
          ConMemberID 
        FROM (SELECT COUNT(MemberConnectionID) AS Occurence , 
             MemberID , 
             ConMemberID 
           FROM  @Table 
           GROUP BY MemberID , 
             ConMemberID 
          ) t2 
        WHERE t2.Occurence > 1 
        ) t3 ON t3.MemberID = T.MemberID 
          AND t3.ConMemberID = t.ConMemberID 
0

我总是用这个小查询(更改以满足您的表)。

Delete MemberConnection 
from MemberConnection 
join 
(select max(MemberConnectionId)as CountIt, MemberId, ConnMemberId 
    from #MemberConnection 
    group by MemberId, ConnMemberId 
    having count(1) > 1 
) as derived 
on MemberConnection.MemberId = derived.MemberId 
and MemberConnection.ConnMemberId = derived.ConnMemberId 
and CountIt > MemberConnectionId