2011-01-16 3 views
0

Я хочу создать хранимую процедуру, которая позволит мне узнать приблизительное время полетов с Испанией в качестве пункта назначения (входящий аэропорт находится в Испании). И у меня есть следующие таблицы:Как создать эту хранимую процедуру?

FLIGHT_PLAN(plan_number NUMBER, outgoing_airport NUMBER, estimated_flight_time NUMBER, incoming_airport NUMBER); 

AIRPORT (code NUMBER, name VARCHAR(20), city_code NUMBER); 

CITY (code NUMBER,name VARCHAR(20),country_code NUMBER); 

COUNTRY (code NUMBER, name VARCHAR(20)); 

Как я могу пройти через это? Как я могу связать поле incomming_airport в FLIGHT_PLAN с кодом в AIRPORT, а затем код в CITY и код в COUNTRY?

Должен ли я использовать внешние ключи или что?

+0

будет трудно оценить время полета данного нет никакой информации из схемы, что вам предусмотрели, что содержит ЛЮБОЙ интервал информации или даже км, чтобы получить. – RichardTheKiwi

+0

Да, огромный упущение. решена. – andandandand

ответ

0

Вы можете связать таблицы с использованием

FROM COUNTRY C 
inner join CITY I on I.country_code = C.code 
inner join AIRPORT A on A.city_code = I.code 
inner join FLIGHT_PLAN F on F.incoming_airport = A.code 
WHERE C.name = 'Spain' 

Примечания: Oracle является аза чувствителен поэтому следите за орфографию Испании, или использовать

WHERE UPPER(C.name) = 'SPAIN' 
0
 
SELECT plan_number, 
     outgoing_airport, 
     incoming_airport, 
     estimated_flight_time 
FROM flight_plan 
WHERE incoming_airport IN (SELECT ap.code 
          FROM airport ap 
          JOIN city ct ON ct.code = ap.city_code 
          JOIN country co ON co.code = ct.country_code 
          WHERE co.name = 'Spain') 

Если вы знаете код испании , вы можете оставить JOIN в подвыборке и сразу добавить WHERE ct.country_code = 42

Если вам нужно имя и город аэропорт, в результате, вы должны присоединиться к основному Agains запросов аэропорта и город:

 
SELECT fp.plan_number, 
     fp.estimated_flight_time, 
     fp.outgoing_airport, 
     out_ap.name as outgoing_airport_name, 
     out_city.name as outgoing_city_name, 
     fp.incoming_airport, 
     in_ap.name as incoming_airport_name, 
     in_city.name as incoming_city_name 
FROM flight_plan fp 
    JOIN airport in_ap ON in_ap.code = fp.incoming_airport 
    JOIN city in_city ON in_city.code = in_ap.city_code 
    JOIN airport out_ap ON out_ap.code = fp.outgoing_airport 
    JOIN city out_city ON out_city.code = out_ap.city_code 
WHERE incoming_airport IN (SELECT ap.code 
          FROM airport ap 
          JOIN city ct ON ct.code = ap.city_code 
          JOIN country co ON co.code = ct.country_code 
          WHERE co.name = 'Spain') 
+0

Зачем вам нужен запрос в предложении WHERE ?, особенно во втором случае, когда вы выполняете два одинаковых запроса? Почему бы не сделать это так, как указал киберкиви? –

+0

Это было необходимо в первом примере, поскольку в нем нет объединения. Во втором примере это просто копировать и вставлять ленивость. Вы верны во втором примере, который потребовал бы присоединиться к таблице страны к основному запросу, который так же важен, как и при подборе. Наверное, вопрос вкуса –

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