2012-02-22 38 views
3

我有如下表CatItemLink在它的記錄:選擇/刪除複製

ID          CatID         ItemID 
-------------------------------------------------------------------------------------------------------------------- 
ADBFBEFE-11F4-4CF0-A889-BBC9358CCF57 A411277E-0873-4323-B016-63F4DFA664C2 B66A47DF-A0E3-4D41-88E9-0B0CB27085D7 
->E212A458-E5E2-4D77-B618-425082CFD8D2 A411277E-0873-4323-B016-63F4DFA664C2 B66A47DF-A0E3-4D41-88E9-0B0CB27085D7 

D071B1C1-7296-4BCA-8AD3-8495704BF679 A411277E-0873-4323-B016-63F4DFA664C2 E288327C-15BF-4B01-BD37-0B6AD5365966 
->B4F59516-2D85-4E2A-8FE4-3EDA27C3DA4F A411277E-0873-4323-B016-63F4DFA664C2 E288327C-15BF-4B01-BD37-0B6AD5365966 
->F3FB6BA5-79EC-4FC5-899E-24FA9F8DFF25 A411277E-0873-4323-B016-63F4DFA664C2 E288327C-15BF-4B01-BD37-0B6AD5365966 

CF3FBD01-4445-4A72-AD1A-BF397970AEFC BFB76F3D-4F06-4200-925D-1968666741A3 E288327C-15BF-4B01-BD37-0B6AD5365966 

ID是主鍵。 [CatID,ItemID]應該是唯一的索引,但DBO沒有指定該索引。如何刪除/選擇標記爲->的記錄,這意味着每個CatID將只有一個ItemID。 (ItemID可以找到不同的CatID,這是好的)。

我有一個解決方案,使用SET ROWCOUNT但我想有一個替代方案。

回答

4
;WITH x AS 
( 
    SELECT ID, rn = ROW_NUMBER() OVER 
    (PARTITION BY CatID, ItemID ORDER BY ID) 
    FROM dbo.CatItemLink 
) 
DELETE x WHERE rn > 1; 
+0

感謝您的幫助。非常感謝:) – kobik 2012-02-22 15:11:53

3
SELECT ID AS IDsToDelete 
FROM (SELECT ID, Row_number() OVER (partition BY catid, itemid ORDER BY id) AS Dup 
     FROM CatItemLink) a 
WHERE dup > 1 

我認爲這將選擇你想要什麼。這將通過CatID和ItemID列對錶進行分區,並有效地爲每一行分配一個等級(即,如果有重複,則會得到高於1的等級)。

+0

問題是,您的查詢返回的行'CatID'只包含1'ItemID'(這不是我想要的)。這個'ItemID'在其他的'CatID'中有重複記錄@ – kobik 2012-02-22 13:19:06

+0

@kobik你能顯示這個查詢返回的哪一行不應該是? *每個*行只包含一個'ItemID',不是嗎? – 2012-02-22 13:34:13

+0

@AaronBertrand,每行*應包含一個唯一的(CatID,ItemID)。返回的行與最後一行相同(實際上我有更多的行)。我錯誤地執行了你的CTE查詢,並且數據被刪除了,所以我不能重現:/只有1個異常。試圖再次複製... – kobik 2012-02-22 14:02:45