2016-01-06 60 views
3

新年快樂!SQL - 刪除重複行但保留空行

問題

我正在寫一個存儲過程,需要在用戶ID清單,它應該返回每一個包含用戶ID 1個記錄:從

  1. 用戶詳細信息User表(名,姓等)
  2. 最新修改的地址記錄來自Address表。如果沒有Address記錄,那麼我們需要返回的地址字段NULLAddressPostcode等)從Country
  3. 國家信息(地區等)

現在我有以下的,這是正確地返回NULL對沒有詳細地址(最後一個記錄的截屏),但用戶ID具有多個地址的記錄,我有多個記錄返回,而不是最新的修改後的地址記錄:

SELECT 
    U.Id, U.FirstName, U.Surname, U.Email, U.DateOfBirth, 
    AD.AddressLine1, AD.AddressLine2, AD.AddressLine3, 
    AD.PostCode, AD.Nickname, AD.Phone, AD.Modified, 
    CNT.Name, CNT.Code, 
    a.MaxDate 
FROM 
    @TableVariable AS List 
LEFT JOIN 
    dbo.Users AS U ON List.Id = U.Id 
LEFT JOIN 
    dbo.Addresses AS AD ON U.Id = AD.User_Id 
LEFT JOIN 
    (SELECT 
     JA.User_Id, MAX(CONVERT(DATE,JA.Modified,10)) AS MaxDate 
    FROM dbo.Addresses AS JA 
    GROUP BY JA.User_Id) A ON (AD.User_Id = A.User_Id AND CONVERT(DATE,AD.Modified,10) = A.MaxDate) 
LEFT JOIN 
    dbo.Countries AS CNT ON AD.Country_Id = CNT.Id 
ORDER BY 
    AD.Modified DESC 

這裏該運行以上結果集。正如你所看到的,我已經正確地得到了一個沒有地址(最後一條記錄)的用戶返回的記錄,但是當我需要1時,我得到了3條2108條記錄,包括最新修改的地址(AD.Modified)。

enter image description here

我使用SQL Server 2008的

回答

3

您可以使用外部應用併爲了通過獲得最新的記錄,像這樣的東西:

FROM @TableVariable AS List 
    LEFT JOIN dbo.Users AS U 
     ON List.Id = U.Id 
    OUTER APPLY (
     SELECT top 1 * 
     FROM dbo.Addresses AS JA 
     WHERE U.Id = JA.User_Id 
     order by Modified DESC 
    ) AD 
    LEFT JOIN dbo.Countries AS CNT 
     ON AD.Country_Id = CNT.Id 
    ORDER BY AD.Modified DESC 
+0

這工作一種享受JamesZ - 謝謝。 – garfbradaz