gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:31:54 24 4
gpt4 key购买 nike

新年快乐!

问题

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

  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

这是运行上面的结果集。正如您所看到的,我已经正确地为没有地址的用户返回了我的记录(最后一条记录),但是当我想要 1 条时,我得到了 2108 的 3 条记录,包括最新修改的地址(AD.Modified)。

enter image description here

我正在使用 SQL Server 2008。

最佳答案

你可以使用外层的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

关于SQL - 删除重复行但保留空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34631481/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com