2016-11-21 64 views
0

我有一張表,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是巨大的,所以我懷疑它的效率更高的CROSS JOIN後做LEFT JOIN。再次使用Teradata SQL。

謝謝!

+0

大量的意見,沒有意見....是什麼尚不清楚?文本牆是否令人恐懼? – rvictordelta

+0

創建您的示例表並以這種方式生成您的示例查詢,這將很容易更多地瞭解您的帖子。使用此鏈接http://sqlfiddle.com/#!6 – user1413

回答

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;