【问题标题】:How to create this stored procedure?如何创建这个存储过程?
【发布时间】:2011-01-16 23:11:04
【问题描述】:

我想创建一个存储过程,让我知道以西班牙为目的地的航班的预计时间(传入机场在西班牙)。我有以下表格:

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

我该如何度过这个难关?如何将FLIGHT_PLAN 中的incomming_airport 字段与AIRPORT 中的代码链接起来,然后将CITY 中的代码和COUNTRY 中的代码链接起来?

我应该使用外键还是什么?

【问题讨论】:

  • 很难估计飞行时间,因为您提供的架构中没有包含任何间隔信息甚至公里的信息。

标签: sql oracle stored-procedures


【解决方案1】:

您可以使用链接表格

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 是 ase 敏感的,因此请注意西班牙的拼写,或使用

WHERE UPPER(C.name) = 'SPAIN'

【讨论】:

    【解决方案2】:
    选择计划号码, 传出机场, 传入机场, 估计飞行时间 FROM 飞行计划 WHERE incoming_airport IN(选择 ap.code 从机场 ap 加入城市 ct ON ct.code = ap.city_code 加入国家 co ON co.code = ct.country_code WHERE co.name = '西班牙')

    如果你知道西班牙的代码,你可以在子选择中省略JOIN,直接添加WHERE ct.country_code = 42

    如果您需要结果中的机场名称和城市,则必须加入主要查询机场和城市:

    选择 fp.plan_number, fp.estimated_flight_time, fp.outgoing_airport, out_ap.name 作为呼出机场名称, out_city.name 作为传出城市名称, fp.incoming_airport, in_ap.name 作为incoming_airport_name, in_city.name 作为incoming_city_name FROM flight_plan fp 加入机场 in_ap ON in_ap.code = fp.incoming_airport 加入城市 in_city ON in_city.code = in_ap.city_code 加入机场 out_ap ON out_ap.code = fp.outgoing_airport 加入城市 out_city ON out_city.code = out_ap.city_code WHERE incoming_airport IN(选择 ap.code 从机场 ap 加入城市 ct ON ct.code = ap.city_code 加入国家 co ON co.code = ct.country_code WHERE co.name = '西班牙')

    【讨论】:

    • 为什么您需要在WHERE 子句中进行查询,尤其是在您执行两个相同查询的第二种情况下?为什么不按照cyberkiwi指出的方式来做呢?
    • 第一个示例中需要它,因为它没有连接。在第二个示例中,它只是复制和粘贴惰性。您在第二个示例中是正确的,它需要将国家表连接到主查询,这与使用子选择一样有效。可能是口味问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多