You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:21:52