我的下表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没有指定该索引。如何删除/选择标有->
的记录,这意味着每ItemID
只有一个CatID
。
(ItemID
可以找到不同的CatID
,这没关系。
我有一个使用SET ROWCOUNT
的解决方案,但我希望有一个替代方案。
答案 0 :(得分: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;
答案 1 :(得分: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的等级。)