使用 SQLite 查找独特的航线
Finding Unique Airline Routes with SQLite
我有两个 table:
AirPorts (IATA_CODE TEXT, LATITUDE REAL, LONGITUDE REAL)
AirRoutes (ROUTE_FROM TEXT, ROUTE_TO TEXT)
AirRoutes table 包括未在机场 table 中列出的机场的航线。它还包括同一路线的多次出现。
首先,我希望 select 所有在 'AirPorts' table 中存在的机场开始和结束的唯一路线。我不知道这是否是最好的方法,但它似乎有效:
SELECT DISTINCT AirRoutes.ROUTE_FROM, AirRoutes.ROUTE_TO FROM AirRoutes
WHERE EXISTS
(SELECT IATA_CODE
FROM AirPorts_SM
WHERE AirRoutes.ROUTE_FROM = IATA_CODE)
AND EXISTS
(SELECT IATA_CODE
FROM AirPorts_SM
WHERE AirRoutes.ROUTE_TO = IATA_CODE);
接下来,我想过滤掉A-B路由returned的B-A路由,所以如果有AMS到DUB的路由,我不想return DUB到AMS还有。
你会怎么做?
最后,我不知道这是否可行,我想得到包含的位置,所以每一行都会像:
ROUTE_FROM=AMS, LAT_FROM=52.3, LON_FROM=4.76, ROUTE_TO=DUB, LAT_TO=53.42, LON_TO=-6.24
你会怎么做?也许这对于一个查询来说太冒险了,我应该把它分成三个部分吗?
使用 CTE 获取 AirRoutes
的 ROUTE_FROM
和 ROUTE_TO
的所有不同对,并将其连接到 AirPorts
的 2 个副本,如下所示:
WITH cte AS (
SELECT DISTINCT
MIN(ROUTE_FROM, ROUTE_TO) ROUTE_FROM,
MAX(ROUTE_FROM, ROUTE_TO) ROUTE_TO
FROM AirRoutes
)
SELECT c.ROUTE_FROM, f.LATITUDE LAT_FROM, f.LONGITUDE LON_FROM,
c.ROUTE_TO, t.LATITUDE LAT_TO, t.LONGITUDE LON_TO
FROM cte c
INNER JOIN AirPorts f ON f.IATA_CODE = c.ROUTE_FROM
INNER JOIN AirPorts t ON t.IATA_CODE = c.ROUTE_TO;
我有两个 table:
AirPorts (IATA_CODE TEXT, LATITUDE REAL, LONGITUDE REAL)
AirRoutes (ROUTE_FROM TEXT, ROUTE_TO TEXT)
AirRoutes table 包括未在机场 table 中列出的机场的航线。它还包括同一路线的多次出现。
首先,我希望 select 所有在 'AirPorts' table 中存在的机场开始和结束的唯一路线。我不知道这是否是最好的方法,但它似乎有效:
SELECT DISTINCT AirRoutes.ROUTE_FROM, AirRoutes.ROUTE_TO FROM AirRoutes
WHERE EXISTS
(SELECT IATA_CODE
FROM AirPorts_SM
WHERE AirRoutes.ROUTE_FROM = IATA_CODE)
AND EXISTS
(SELECT IATA_CODE
FROM AirPorts_SM
WHERE AirRoutes.ROUTE_TO = IATA_CODE);
接下来,我想过滤掉A-B路由returned的B-A路由,所以如果有AMS到DUB的路由,我不想return DUB到AMS还有。
你会怎么做?
最后,我不知道这是否可行,我想得到包含的位置,所以每一行都会像:
ROUTE_FROM=AMS, LAT_FROM=52.3, LON_FROM=4.76, ROUTE_TO=DUB, LAT_TO=53.42, LON_TO=-6.24
你会怎么做?也许这对于一个查询来说太冒险了,我应该把它分成三个部分吗?
使用 CTE 获取 AirRoutes
的 ROUTE_FROM
和 ROUTE_TO
的所有不同对,并将其连接到 AirPorts
的 2 个副本,如下所示:
WITH cte AS (
SELECT DISTINCT
MIN(ROUTE_FROM, ROUTE_TO) ROUTE_FROM,
MAX(ROUTE_FROM, ROUTE_TO) ROUTE_TO
FROM AirRoutes
)
SELECT c.ROUTE_FROM, f.LATITUDE LAT_FROM, f.LONGITUDE LON_FROM,
c.ROUTE_TO, t.LATITUDE LAT_TO, t.LONGITUDE LON_TO
FROM cte c
INNER JOIN AirPorts f ON f.IATA_CODE = c.ROUTE_FROM
INNER JOIN AirPorts t ON t.IATA_CODE = c.ROUTE_TO;