我目前與用戶和個人資料圖片有一對多的關係,我需要將其更改爲一對一的關係。刪除基於「分組」的重複項?
我有一個用戶表,然後有一個用戶ID的ImageReference表。
我需要做的是爲每個擁有多個關聯ImageReference記錄的用戶刪除所有ImageReference記錄,除了最近的一個。
所以,如果一個用戶具有兩個圖像的引用,一個具有100的ID,和一個爲150的ID,我需要刪除與100
的最佳方式在任何想法該ID的一個這樣做?
我目前與用戶和個人資料圖片有一對多的關係,我需要將其更改爲一對一的關係。刪除基於「分組」的重複項?
我有一個用戶表,然後有一個用戶ID的ImageReference表。
我需要做的是爲每個擁有多個關聯ImageReference記錄的用戶刪除所有ImageReference記錄,除了最近的一個。
所以,如果一個用戶具有兩個圖像的引用,一個具有100的ID,和一個爲150的ID,我需要刪除與100
的最佳方式在任何想法該ID的一個這樣做?
插入所有最新的ImageReference行(按用戶ID選擇最大ID分組)到臨時表中,然後將該表重新連接到ImageReference表中刪除那些不連接的行(其中ImageReference.ID爲null )。
您是否嘗試過類似
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
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)
謝謝你,這可能會更簡單,但我使用了第一個解決方案,所以我必須給他答案。 :) – Liggi 2010-11-18 11:52:45
謝謝,我答曰到的第一個男人,但是這是未來非常有幫助。 – Liggi 2010-11-18 11:53:47
數據如何從@UserImages表中刪除?我可以看到從命名爲Vals的CTE中移除了較早的ImageRefID。 – 2010-11-18 20:48:53
它實際上是從底層表中刪除,而不是CTE本身。 – 2010-11-19 04:16:30