根据“分组”删除重复项?

时间:2010-11-18 11:35:49

标签: sql-server tsql

我目前与用户和个人资料图片存在一对多的关系,我需要将其更改为一对一的关系。

我有一个Users表,然后是一个具有UserID的ImageReference表。

我需要做的是每个拥有多个关联ImageReference记录的用户,删除所有ImageReference记录,除了最近的记录。

因此,如果用户有两个图像引用,一个ID为100,另一个ID为150,我需要删除ID为100的图像。

有关最佳方法的任何想法吗?

3 个答案:

答案 0 :(得分:0)

插入所有最新的ImageReference行(按用户ID选择最大ID分组)到临时表中,然后将该表连接到ImageReference表上,删除那些不连接的行(其中ImageReference.ID为null) 。

答案 1 :(得分:0)

你有没有试过像

这样的东西
SELECT  UserID,
        MAX(ImageRefID) LastUserImageID
FROM    UserImages
GROUP BY UserID

如果要将此架构更改为1-1,则应该在Users表中包含ImageRedID。

使用Sql Server 2005,您也可以直接从表中删除它们。

看看下面的例子。

DECLARE @UserImages TABLE(
        ImageRefID INT,
        UserID INT
)

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

;WITH Vals AS (
        SELECT  UserID,
                ImageRefID,
                ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY ImageRefID DESC) RowID
        FROM    @UserImages
)
DELETE
FROM    Vals 
WHERE   RowID > 1

SELECT  *
FROM    @UserImages

答案 2 :(得分:0)

delete from ImageReference where ImgID in (
select ImgID
from ImageReference ir
  join (select UserID, max(ImgID) as MaxImgID
   from ImageReference
   group by UserID) MaxImgIDPerUser
 on ir.UserID = MaxImgIDPerUser.UserID
where ir.ImgID < MaxImgIDPerUser.MaxImgID)