2012-02-22 10 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は主キーです。 [CatIDItemID]は一意のインデックスである必要がありますが、DBOはそのインデックスを指定していませんでした。 ->と記されているレコードを削除/選択するには、CatIDごとに1つだけ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

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'に' ItemID'が1つしか含まれていない行が返されるということです。この 'ItemID'は他の' CatID'に重複しています – kobik

+0

@kobikこの問合せで返される行は何であるべきかを表示できますか? *すべての*行には「ItemID」が1つだけ含まれていますか? –

+0

@AaronBertrand、すべての行*は一意( 'CatID'、' ItemID')を含むべきです。返された行は最後の行と同じでした(実際はもっと多くの行があります)。誤ってCTEクエリを実行しましたが、データが削除されて再作成できませんでした:/ 1つしか異常がありませんでした。もう一度書き直そうとしています... – kobik

関連する問題