【问题标题】:SQL Where with next joinsSQL Where 与下一个连接
【发布时间】:2015-07-19 21:38:07
【问题描述】:

我正在尝试使用函数更新表,但我的更新语法遇到了一些问题,想知道是否有人可以帮助指出我哪里出错了。

我的航班表:

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

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

到目前为止,我有:

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,这不起作用。也许只是删除 WHERE 之前的第一个开放括号和关闭括号。

标签: sql oracle join where-clause correlated-subquery


【解决方案1】:

啊,我终于明白了!

我必须将 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 非常接近。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我之前尝试过,但没有运气,再试一次,仍然出现同样的错误。
    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多