我有一张桌子,flight_schedule
,包含一堆航段。下面我有一个Terradata SQL查询,它创建了芝加哥和丹佛之间的两个段行程列表。即每排有两个航班,最终将乘客从芝加哥运往丹佛。例如,第一行包含从芝加哥到奥马哈的一条腿的航班信息,然后是从奥马哈到丹佛的一条腿。这个查询工作正常。
SELECT A.flt_num, A.dprt_sta_cd, A.arrv_sta_cd, A.sch_dprt_dtml, A.sch_arrv_dtml,
B.flt_num, B.dprt_sta_cd, B.arrv_sta_cd, B.sch_dprt_dtml, B.sch_arrv_dtml
FROM
flight_schedule A
CROSS JOIN
flight_schedule B
WHERE
A.dprt_sta_cd = 'Chicago' AND
B.arrv_sta_cd = 'Denver' AND
A.arrv_sta_cd = B.dprt_sta_cd AND
A.sch_arrv_dtml < B.sch_dprt_dtml
ORDER BY B.sch_arrv_dtml;
我有另一张桌子,flight_seat_inventory
,包括每个航班号不同舱室的座位。以下查询汇总了每个航班号的总可用座位数。这个查询也是A-OK。
SELECT flt_num, SUM(seat_cnt) as avail_seats
FROM flight_seat_inventory
GROUP BY flt_num;
我想将这两个查询与LEFT JOIN组合两次,以便每个航班都有相应的avail_seats
值。我怎么能这样做?
为了更加清晰,我认为我想要的Select
语句如下:
SELECT A.flt_num, A.dprt_sta_cd, A.arrv_sta_cd, A.sch_dprt_dtml, A.sch_arrv_dtml, C.avail_seats
B.flt_num, B.dprt_sta_cd, B.arrv_sta_cd, B.sch_dprt_dtml, B.sch_arrv_dtml, D.avail_seats
flight_schedule
是巨大的,所以我怀疑在LEFT JOIN
之后执行CROSS JOIN
会更有效率。再次,使用Teradata SQL。
谢谢!
答案 0 :(得分:0)
在我执行WITH
之前,我需要使用LEFT JOIN
命令将第二个席位查询声明为临时表:
WITH tempSeatsTable AS (
SELECT flt_num, SUM(seat_cnt) as avail_seats
FROM flight_seat_inventory
GROUP BY flt_num
)
SELECT
A.flt_num, A.dprt_sta_cd, A.arrv_sta_cd, A.sch_dprt_dtml, A.sch_arrv_dtml, C.avail_seats
B.flt_num, B.dprt_sta_cd, B.arrv_sta_cd, B.sch_dprt_dtml, B.sch_arrv_dtml, D.avail_seats
FROM
flight_schedule A
CROSS JOIN
flight_schedule B
LEFT JOIN
tempSeatsTable C
ON A.flt_num = C.flt_num
LEFT JOIN
tempSeatsTable D
ON B.flt_num = D.flt_num
WHERE
A.dprt_sta_cd = 'Chicago' AND
B.arrv_sta_cd = 'Denver' AND
A.arrv_sta_cd = B.dprt_sta_cd AND
A.sch_arrv_dtml < B.sch_dprt_dtml
ORDER BY B.sch_arrv_dtml;