2013-01-03 62 views
0

這裏是我的查詢。當我內部連接2個表時,沒有問題。sql server 2008,內部連接3表時如何擺脫重複

SELECT S.* , 
     U.Avatar , 
     U.Displayname , 
     ROW_NUMBER() OVER (ORDER BY S.Id DESC) rownum 
FROM dbo.Smoothie AS S 
     INNER JOIN dbo.[User] AS U ON S.UserId = U.Id 
WHERE S.IsPublic = 1 
     AND S.Status = 3 
     AND S.UserId = 2 

然後,我又添加了一個內連接。現在,我得到了很多重複。

SELECT S.* , 
     U.Avatar , 
     U.Displayname, 
     ROW_NUMBER() OVER (ORDER BY S.Id DESC) rownum 
FROM dbo.Smoothie AS S 
     INNER JOIN dbo.[User] AS U ON S.UserId = U.Id 
     INNER JOIN dbo.Favorite AS F ON U.Id = F.UserId 
WHERE S.IsPublic = 1 
     AND S.Status = 3 
     AND F.UserId = 2 

一個解決方案是使用截然不同的。不過,我必須註釋掉row_number,我需要row_number來做分頁。有沒有另一種方法來擺脫重複?

SELECT DISTINCT S.* , 
     U.Avatar , 
     U.Displayname 
     -- ROW_NUMBER() OVER (ORDER BY S.Id DESC) rownum 
FROM dbo.Smoothie AS S 
     INNER JOIN dbo.[User] AS U ON S.UserId = U.Id 
     INNER JOIN dbo.Favorite AS F ON U.Id = F.UserId 
WHERE S.IsPublic = 1 
     AND S.Status = 3 
     AND F.UserId = 2 

回答

3

爲什麼不使用你的查詢,而ROW_NUMBER作爲一個子查詢,然後添加行號回來以後:

SELECT *, 
    ROW_NUMBER() OVER (ORDER BY subQuery.Id DESC) rownum 
FROM (
SELECT DISTINCT S.* , 
    U.Avatar , 
    U.Displayname 
FROM dbo.Smoothie AS S 
    INNER JOIN dbo.[User] AS U ON S.UserId = U.Id 
    INNER JOIN dbo.Favorite AS F ON U.Id = F.UserId 
WHERE S.IsPublic = 1 
    AND S.Status = 3 
    AND F.UserId = 2 
) AS subQuery 
0

Dense_Rank也跟你未修改的查詢工作。