下面是我的查询,我还附加了预期的输出和当前的查询结果输出。.如何更新查询以获得预期的结果?
select
bookings.id as departure,
return_detail .id as return_id
from
bookings
left join bookings return_detail on
bookings.trip_id = return_detail .trip_id
left join booking_passengers bp on
bookings.id = bp.bp_booking_id
left join booking_passengers return_bp on
return_detail .id = return_bp .bp_booking_id
where
bp.bp_passenger_id = 31
and return_bp .bp_passenger_id = 31
--and bp.id != return_bp .id
order by
bookings.id asc
预期输出:
41-42
43-44
null-58
83-84
91-null
经过大量实验最终找到了解决方案。
首先将表数据分开,如下场景:
Case-I: (departure, return_id) ≡ (departure, departure+1)
Case-II: (departure, return_id) ≡ (Not Avalible, return_id is Even)
Case-III: (departure, return_id) ≡ (departure is Odd, Not Available)
SQL查询:
with T_validBoth AS (
select * from T
where ((departure + 1) = return_id) and (departure%2 = 1)
order by departure, return_id
),
T_validRight AS (
select NULL as departure, return_id from T
where (departure = return_id) and (return_id%2 = 0)
order by departure, return_id
),
T_validLeft AS (
select departure, NULL as return_id from T
where (departure = return_id) and (return_id%2 = 1)
order by departure, return_id
),
T_Final AS (
select * from T_validBoth
union
select * from T_validRight
where return_id NOT in (select return_id from T_validBoth)
union
select * from T_validLeft
where departure NOT in (select departure from T_validBoth)
)
select * from T_Final
order by COALESCE(departure, return_id)
示例代码:db<>fiddle
输出:
我希望它能解决这个问题..
哇,这是一个很好的问题...... 我真的很喜欢...