2013-02-01 127 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