2016-11-21 23 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 огромно, так что я подозреваю, что это более эффективно, чтобы сделать LEFT JOIN после CROSS 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; 

 Смежные вопросы

  • Нет связанных вопросов^_^