新年快乐!
问题
我正在编写一个包含用户ID列表的存储过程,它应该返回包含以下内容的每个用户ID 的1条记录
User
表(名字,姓氏等)的用户详细信息Address
表的最新修改地址记录。如果没有Address
条记录,那么我们需要在地址字段中返回NULL
(Address
,Postcode
等)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
以下是运行上述内容后的结果集。正如你所看到的,我已经正确地为没有地址的用户(最后一条记录)返回了我的记录,但是当我想要1时,我得到了210条记录,包括最新的修改地址(AD.Modified)。
我正在使用SQL Server 2008。
答案 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