SQL where with next joins

SQL Where with next joins

我正在尝试用一个函数更新 table 并 运行 解决我的更新语法的一些问题,想知道是否有人可以帮助指出我哪里出错了。

我的航班 table:

    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 函数声明没有问题:

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

我遇到问题的地方是更新航班 table 以将此 select 的距离计算包含到航班中的适当元组中。我想做的是检查 select 语句中的源机场和目的地机场是否等于航班 table 中的源机场和目的地机场并相应地插入,但是我在编写此语句时一直遇到问题.

到目前为止我有:

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

任何人都知道如何解决这个问题,我认为问题在于在联接之外使用 where 语句。

您需要为嵌套的 select 命名,以便能够使用 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;

啊我终于明白了!!

我必须将 SRC 和 DEST 保留在我的内部 select 语句中,以便我可以在 where 子句中命名和引用它们,然后将整个东西嵌套在另一个 select 中,所以我只能选择更新的距离。答案在这里:

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 非常接近。