基于重复ID的SQL左连接查询需求技术求助
处理SQL查询中重复BookingID的解决方案
先帮你理清楚问题:从你的描述来看,当前的左连接查询应该是出现了重复的BookingID记录——大概率是因为@tmpAvailability里的多条可用性记录匹配到了vwRSBooking里的同一条预订,或者反过来。另外先提个小细节:你的原查询里有两处字段名可能写错了:
- 视图
vwRSBooking里的日期字段是DepartDate,但你写的是B.Depart - 视图里的供应商编码字段是
Code,但你写的是B.ServiceCode
这些字段不匹配可能会导致关联逻辑错误,甚至加重重复问题,建议先修正。
下面针对不同的业务需求,给你几种处理重复BookingID的方案:
方案1:去重,保留每个BookingID的第一条匹配记录
如果你的需求是每个BookingID只保留一条关联的可用性记录,可以用窗口函数ROW_NUMBER()给每个BookingID的匹配结果编号,然后只取编号为1的记录:
WITH RankedBookings AS ( SELECT A.SupplierCode AS ServiceCode, A.StartDate, A.Available, B.Nights, B.BookingID, -- 按BookingID分组,按StartDate排序取第一条匹配记录 ROW_NUMBER() OVER (PARTITION BY B.BookingID ORDER BY A.StartDate) AS rn FROM @tmpAvailability A LEFT JOIN vwRSBooking B ON B.DepartDate = A.StartDate AND B.Code = A.SupplierCode AND B.StatusID IN (2640, 2621) ) SELECT ServiceCode, StartDate, Available, Nights, BookingID FROM RankedBookings WHERE rn = 1 ORDER BY StartDate;
你可以根据实际需求调整ORDER BY A.StartDate的排序规则,比如换成A.Available DESC来保留可用量最大的那条记录。
方案2:聚合重复BookingID的可用性数据
如果同一个BookingID对应多条可用性记录,你需要对这些数据做汇总(比如求和、取最大值),可以用GROUP BY结合聚合函数:
SELECT A.SupplierCode AS ServiceCode, A.StartDate, SUM(A.Available) AS TotalAvailable, -- 可替换为MAX(A.Available)或AVG(A.Available) B.Nights, B.BookingID FROM @tmpAvailability A LEFT JOIN vwRSBooking B ON B.DepartDate = A.StartDate AND B.Code = A.SupplierCode AND B.StatusID IN (2640, 2621) WHERE B.BookingID IS NOT NULL -- 只统计有匹配预订的记录(可选) GROUP BY A.SupplierCode, A.StartDate, B.Nights, B.BookingID ORDER BY StartDate;
这个方案适合你需要统计同一个预订对应的总可用量、最大可用量等场景。
方案3:排查重复BookingID的根源
如果你想先搞清楚哪些BookingID重复了、重复了多少次,可以用下面的查询定位问题:
SELECT BookingID, COUNT(*) AS MatchCount FROM ( SELECT B.BookingID FROM @tmpAvailability A LEFT JOIN vwRSBooking B ON B.DepartDate = A.StartDate AND B.Code = A.SupplierCode AND B.StatusID IN (2640, 2621) WHERE B.BookingID IS NOT NULL ) AS BookingMatches GROUP BY BookingID HAVING COUNT(*) > 1 ORDER BY MatchCount DESC;
通过这个查询,你能看到重复的BookingID以及它们的匹配次数,方便你判断是@tmpAvailability里有多条同日期同供应商的记录,还是vwRSBooking里存在重复的预订数据。
内容的提问来源于stack exchange,提问作者user3455191
相关产品推荐
相关产品推荐

