2015-05-08 2 views
1

Я пытаюсь обновить таблицу с помощью функции и столкнуться с некоторыми проблемами с моим синтаксисом обновлений, было интересно, может ли кто-нибудь помочь указать, где я ошибаюсь.SQL Где со следующими объединениями

Мои полёты стол:

SQL> describe flights 
Name          Null? Type 
----------------------------------------- -------- ------------ 

AIRLINE           VARCHAR2(3) 
AIRLINE_ID           VARCHAR2(5) 
SRC_AIRPORT          VARCHAR2(4) 
SRC_AIRPORT_ID          VARCHAR2(5) 
DEST_AIRPORT          VARCHAR2(4) 
DEST_AIRPORT_ID         VARCHAR2(5) 
CODESHARE           CHAR(1) 
STOPS            NUMBER(38) 
EQUIPMENT           VARCHAR2(50) 
DISTANCE           NUMBER 

Мой оператор выбора с функцией не работает без проблем:

SELECT SRC,DEST,calc_distance(lat1,lon1,lat2,lon2)as dist 
FROM (Select flights.src_airport as SRC, airports1.Latitude as lat1, 
airports1.longitude as lon1,flights.dest_airport as DEST, airports2.Latitude as lat2, 
airports2.longitude as lon2 FROM airports airports1 JOIN 
flights 
ON airports1.iata_faa = flights.src_airport 
JOIN 
airports airports2 
ON airports2.iata_faa = flights.dest_airport); 

Где у меня возникли проблемы обновляет таблицу полетов включить вычисление расстояния от этого выберите в соответствующий кортеж в полетах. Что я хочу сделать, так это проверить, что исходные и целевые аэропорты из отборочного заявления равны аэропортам src и destination из таблицы рейсов и соответственно вставляют, но я продолжаю получать проблемы при написании этого заявления.

До сих пор у меня есть:

UPDATE flights f1 
SET distance = 
    (
    SELECT DISTINCT calc_distance(lat1,lon1,lat2,lon2) 
    FROM 
     (Select f2.src_airport as SRC, airports1.Latitude as lat1, 
     airports1.longitude as lon1,f2.dest_airport as DEST, airports2.Latitude as lat2, 
     airports2.longitude as lon2 FROM airports airports1 
     JOIN 
     flights f2 
     ON airports1.iata_faa = f2.src_airport 
     JOIN 
     airports airports2 
     ON airports2.iata_faa = f2.dest_airport 
     ) 
    ) 
    WHERE 
     f1.src_airport = f2.src_airport 
     AND 
     f1.dest_airport = f2.dest_airport; 

Но хранение получаю ошибку:

ERROR at line 20: 
ORA-00904: "F2"."DEST_AIRPORT": invalid identifier 

Кто-нибудь есть какие-либо идеи, как я мог бы исправить это, я думаю, что вопрос с использованием где заявление вне из объединений.

+0

Возможно, вы используете 'WHERE' вне' SELECT', который не будет работать. Возможно, просто удалите первый открытый палец и близкий палец перед 'WHERE'. –

ответ

1

А я, наконец, получил его!

Мне пришлось сохранить SRC и DEST внутри моего внутреннего оператора выбора, чтобы я мог назвать и ссылаться на них в предложении where, но затем вложить все это внутри другого, чтобы я мог выбрать ТОЛЬКО расстояние до обновления с. Ответ здесь:

UPDATE flights f1 
SET distance = 
(
    SELECT T.dist 
    FROM (
      SELECT DISTINCT SRC,DEST,calc_distance(lat1,lon1,lat2,lon2)as dist 
      FROM (Select flights.src_airport as SRC, airports1.Latitude as lat1, 
      airports1.longitude as lon1,flights.dest_airport as DEST, airports2.Latitude as lat2, 
      airports2.longitude as lon2 FROM airports airports1 JOIN 
      flights 
      ON airports1.iata_faa = flights.src_airport 
      JOIN 
      airports airports2 
      ON airports2.iata_faa = flights.dest_airport) 
     )T 
    WHERE 
    T.SRC = f1.src_airport 
    AND 
    T.DEST = f1.dest_airport  
); 

Спасибо за помощь, я думаю, @RLS был очень близок.

+0

Поздравляем! Обязательно отметьте свой ответ как принятый :). –

0

Вам нужно будет указать свой вложенный выбор, чтобы вы могли фильтровать с предложением where.

(Select calc_distance(lat1,lon1,lat2,lon2) as distance, f2.src_airport, f2.dest_airport 
...) table2 
    WHERE 
     f1.src_airport = table2.src_airport 
     AND 
     f1.dest_airport = table2.dest_airport; 
+0

Я пробовал это раньше и не повезло, дал ему еще один шаг и по-прежнему получал ту же ошибку. – Bagelstein

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