2010-11-08 83 views
2

我無法理解以下查詢如何帶來適當的結果,請給我解釋一下數據庫查詢說明

考慮航空公司數據庫的以下關係模式。

customer(id, name, age, gender) 
onFlight(id, flightNo, flightDate) 
flightInfo(flightNo, fromCity, toCity, startTime, duration 

。機票(flightNo,flightDate),其上有至少兩個客戶

SELECT f1.flightNo, f1.flightDate 
FROM onFlight as f1, onFlight as f2 
WHERE f1.flightNo = f2.flightNo AND f1.flightDate=f2.flightDate AND __________________ f1.id <> f2.id 

可我寫這篇文章的查詢,而不是...

select flightNo, flightDate count(id) from onFlight groupBy(id) having count(id)>1 
+0

這是功課?這將產生一個交錯的航班列表(f1 ID:1,3,5,7)(f2 ID:2,4,6,8),這是你想達到的目的嗎? – dooburt 2010-11-08 13:06:44

+0

不,家裏的工作我正在學習SQL我自己的,但我遇到麻煩理解這個查詢,這就是爲什麼我把它放在這裏 – NoviceToDotNet 2010-11-08 13:13:07

回答

3
SELECT f1.flightNo, f1.flightDate 
FROM onFlight as f1, onFlight as f2 
WHERE f1.flightNo = f2.flightNo 
     AND f1.flightDate = f2.flightDate 
     AND f1.id <> f2.id 

這建立交叉連接(所有可能的組合)每個flightNo/flightDate對的所有航班可能,這將選擇所有不匹配的記錄。

這不是最有效的方法,因爲如果有兩個以上的客戶,它將返回所有重複項。

更有效的方法是:

SELECT flightNo, flightDate 
FROM onFlight 
GROUP BY 
     flightNo, flightDate 
HAVING COUNT(*) >= 2 

您可以與任何其他編號替換2這裏。

+0

什麼應該替代比請建議我..或在你寫下查詢 – NoviceToDotNet 2010-11-08 13:04:42

+0

abve查詢計數做什麼,它是否計算總數不分爲(航班號,飛行日期) – NoviceToDotNet 2010-11-08 13:11:50

+0

@NoviceToDotNet:是的。 – Quassnoi 2010-11-08 13:13:33

1

這可能是更有效的:

SELECT f1.flightNo, f1.flightDate, COUNT(*) 
FROM onFlight AS f1, onFlight AS f2 
WHERE f1.flightNo = f2.flightNo AND f1.flightDate=f2.flightDate 
GROUP BY f1.flightNo, f1.flightDate 
HAVING COUNT(*)>=2