2011-03-31 91 views
2

我正在与航空公司,机场及其路线合作。
我有两个表路线和补充。 补充表是通过搜索共享节点的路线段构建的。 (B是路由A-> B-> C中的节点)SQL查询问题

我想构建补充表,以便通过节点到达的目标是唯一的。换句话说,航空公司不应该能够自己到达目的地C.

建立补充表后,我想:

SELECT t1.* 
FROM complement AS t1 
    , routes AS t2 
WHERE t1.airline_id1 = t2.airline_id 
    AND t1.source = t2.source 
    AND t1.destination != t2.destination 

* airline_id1指服务于路径A到B的第一航空公司(在A-> B-> C ^路线)
原表有大约650,000条记录,但是我用这个查询获得了超过1000万条记录。我确信我在做这件事情时出了什么问题。

任何帮助将不胜感激!

编辑:补表中的某些字段是airline_id1,airline_id2,source_airport,节点,destination_airport

+0

补充表中有什么?你能提供一些样本数据吗? – 2011-03-31 20:09:47

+2

条件t1.destination!= t2.destination似乎是易受影响的,我们可以有类似A-> B-> C和A-> B-> D的情况。所以这两个记录都会满足条件,因此结果数量将会更多。 – 2011-03-31 20:11:15

+0

如果规则是“一家航空公司不应该能够自己到达目的地C”。那么为什么这是在你的查询中:“t1.airline_id1 = t2.airline_id”? – user662852 2011-03-31 20:11:51

回答

2

是否complement表有一个airline_id2字段(旅行的B->C部分)?

这会给其中两个部分由不同的航空公司所做的一切“补充”路线:

SELECT c.* 
FROM complement AS c 
WHERE c.airline_id1 != c.airline_id2 

或者,也许你想:

(所有的“补充”从路线到C航空公司没有从A到C的“直接”路线)。

SELECT c.* 
FROM complement AS c 
    LEFT JOIN routes AS r 
    ON c.source_airport = r.source_airport 
     AND c.destination_airport = r.destination_airport 
     AND c.airline_id1 = r.airline_id 
WHERE r.id IS NULL 
+0

是的,airline_id2是服务从B到C的路线的第二家航空公司 – 2011-03-31 20:27:48