2011-01-16 3 views
0

Je veux créer une procédure stockée qui me permet de connaître l'heure estimée des vols avec l'Espagne comme destination (l'aéroport entrant est en Espagne). Et j'ai les tables suivantes:Comment créer cette procédure stockée?

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)); 

Comment puis-je passer par cela? Comment puis-je chaîner le champ incomming_airport au FLIGHT_PLAN avec le code AIRPORT, puis le code CITY et le code COUNTRY? Dois-je utiliser des clés étrangères ou quoi?

+0

serait difficile d'estimer un temps de vol étant donné qu'il n'y a pas d'information à partir du schéma que vous ont fourni qui contient toutes les informations d'intervalle ou même kms à partir duquel. – RichardTheKiwi

+0

oui, énorme omission. résolu. – andandandand

Répondre

0

Vous pouvez lier les tables à l'aide

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' 

Note: Oracle est ase sensible regarder si l'orthographe de l'Espagne, ou utilisez

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') 

Si vous connaissez le code pour l'Espagne , vous pouvez omettre le JOIN dans le sous-select et ajouter directement WHERE ct.country_code = 42

Si vous avez besoin le nom et la ville de l'aéroport dans le résultat, vous aurez à rejoindre le principal aéroport de agains de requête et de la ville:

 
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

Pourquoi avez-vous besoin d'une requête dans la clause 'WHERE', particulièrement dans le second cas où vous faites deux requêtes identiques? Pourquoi ne pas le faire d'une manière que cyberkiwi a souligné? –

+0

Il était nécessaire dans le premier exemple car il n'y a pas de jointure dedans. Dans le second exemple, il suffit de copier et coller lazyness. Vous avez raison dans le deuxième exemple, il serait nécessaire de joindre la table de pays à la requête principale qui est tout aussi valide que d'utiliser le sous-select. Probablement une question de goût –

Questions connexes