将选定的表连接到交叉连接表

时间:2016-11-21 20:29:55

标签: sql left-join teradata cross-join

我有一张桌子,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。

谢谢!

1 个答案:

答案 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;