代码之家  ›  专栏  ›  技术社区  ›  Liggi

基于“分组”删除重复项?

  •  1
  • Liggi  · 技术社区  · 15 年前

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

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

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

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

    你知道最好的办法吗?

    3 回复  |  直到 15 年前
        1
  •  0
  •   bleeeah    15 年前

    将所有最新的ImageReference行(选择max ID grouping by user ID)插入到临时表中,然后将该表左键联接回ImageReference表,删除那些不联接的行(其中ImageReference.ID为空)。

        2
  •  0
  •   Adriaan Stander    15 年前

    你试过类似的东西吗

    SELECT  UserID,
            MAX(ImageRefID) LastUserImageID
    FROM    UserImages
    GROUP BY UserID
    

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

    使用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
    
        3
  •  0
  •   Sir Wobin    15 年前
    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)