2011-03-31 88 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