SQL 查询不适用于相应的输出

问题描述 投票:0回答:1

下面是我的查询,我还附加了预期的输出和当前的查询结果输出。.如何更新查询以获得预期的结果?

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

enter image description here

预期输出:

41-42
43-44
null-58
83-84
91-null
mysql
1个回答
0
投票

经过大量实验最终找到了解决方案。

首先将表数据分开,如下场景:

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
输出:

enter image description here

我希望它能解决这个问题..

哇,这是一个很好的问题...... 我真的很喜欢...

© www.soinside.com 2019 - 2024. All rights reserved.