SQL - 删除重复行但保持空行

时间:2016-01-06 11:00:57

标签: sql sql-server sql-server-2008

新年快乐!

问题

我正在编写一个包含用户ID列表的存储过程,它应该返回包含以下内容的每个用户ID 的1条记录

  1. 来自User表(名字,姓氏等)的用户详细信息
  2. 来自Address表的最新修改地址记录。如果没有Address条记录,那么我们需要在地址字段中返回NULLAddressPostcode等)
  3. Country表(地区等)
  4. 的国家/地区详细信息

    现在我有以下内容,正确返回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时,我得到了210条记录,包括最新的修改地址(AD.Modified)。

    enter image description here

    我正在使用SQL Server 2008。

1 个答案:

答案 0 :(得分: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