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 非常接近。
我正在尝试用一个函数更新 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 非常接近。