2010-11-18 98 views
1

我目前與用戶和個人資料圖片有一對多的關係,我需要將其更改爲一對一的關係。刪除基於「分組」的重複項?

我有一個用戶表,然後有一個用戶ID的ImageReference表。

我需要做的是爲每個擁有多個關聯ImageReference記錄的用戶刪除所有ImageReference記錄,除了最近的一個。

所以,如果一個用戶具有兩個圖像的引用,一個具有100的ID,和一個爲150的ID,我需要刪除與100

的最佳方式在任何想法該ID的一個這樣做?

回答

0

插入所有最新的ImageReference行(按用戶ID選擇最大ID分組)到臨時表中,然後將該表重新連接到ImageReference表中刪除那些不連接的行(其中ImageReference.ID爲null )。

0

您是否嘗試過類似

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

如果這個模式是改變到1-1,你應該包括在用戶表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 
+0

謝謝,我答曰到的第一個男人,但是這是未來非常有幫助。 – Liggi 2010-11-18 11:53:47

+0

數據如何從@UserImages表中刪除?我可以看到從命名爲Vals的CTE中移除了較早的ImageRefID。 – 2010-11-18 20:48:53

+0

它實際上是從底層表中刪除,而不是CTE本身。 – 2010-11-19 04:16:30

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) 
+0

謝謝你,這可能會更簡單,但我使用了第一個解決方案,所以我必須給他答案。 :) – Liggi 2010-11-18 11:52:45