2016-11-21 13 views
0

私はフライトセグメントの束で構成されるテーブルflight_scheduleを持っています。私はシカゴとデンバーの間の2つのセグメントの旅程のリストを作成するTerradata SQLクエリを持っています。すなわち、各列に2つのフライトがあり、最終的にシカゴからデンバーに乗客を得る。たとえば、最初の行にはシカゴからオマハまでの脚のフライト情報が含まれ、その後オマハからデンバーまでの後のレッグが含まれます。このクエリは正常に動作します。クロステーブルに選択したテーブルを結合する

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; 

は、私は各フライトは、対応するavail_seats値を持つように、二回、JOINをLEFTとこれらの2つのクエリを結合したいです。これどうやってするの?追加明確にするために

、私は私の希望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 JOINLEFT JOINを行うには、より効率的だと思います。ここでも、Teradata SQLを使用します。

ありがとうございます!

+0

ビューのたくさん、コメントはありません....明確ではない何かですか?テキストの壁は威圧していますか? – rvictordelta

+0

サンプルテーブルを作成し、サンプルクエリを生成します。これにより、あなたの投稿についてもっと理解しやすくなります。このリンクを使用してくださいhttp://sqlfiddle.com/#!6 – user1413

答えて

0

私はLEFT JOINをした前WITHコマンドを使用して、一時テーブルとして第二席クエリを宣言するために必要な:

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; 
関連する問題