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

3

祝您新年快乐SO!

问题

我正在编写一个存储过程,它接受一组用户ID,并应该返回每个用户ID的1条记录,其中包含:

  1. User表中的用户详细信息(名字、姓氏等)
  2. Address表中最新修改的地址记录。如果没有Address记录,则在地址字段(AddressPostcode等)中返回NULL
  3. Country表中的国家详细信息(地区等)

现在我有以下内容,正确地返回了无地址详情的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

以下是运行上述代码后的结果集。您可以看到,我已经成功地返回了一个没有地址的用户记录(最后一条记录),但是在2108的情况下,我得到了3条记录,而我只想要1条记录,其中包括最近修改的地址(AD.Modified)。

enter image description here

我正在使用SQL Server 2008。

1个回答

3

您可以使用Outer Apply和Order By来获取最新的记录,类似于以下方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接