2014-11-05 39 views
0

所以這裏的問題的Oracle SQL - 嵌套查詢與分組和HAVING子句

查找已飛行更遠距離的目的地不是所有的航班,同一目的地

的平均距離飛機的ID

這裏是架構

目的地(DID:整數,DNAME:字符串,狀態:字符串)

飛機(援助:整數,aname:字符串,顏色:字符串)

航班(援助:整數,做的:整數,FDATE:日期,距離:真)

到目前爲止,我已經能夠找到對此查詢的兩個不同部分的答案。

我發現了飛往每個目的地的平均距離。 我還發現每架飛機飛到每個位置的總距離。

以上部分的查詢如下:

SELECT D.DID, AVG(F.DIST) as AvgDist from Destinations D join Flights F ON F.DID = D.DID GROUP BY D.DID; 

SELECT F.AID,F.DID, SUM(F.DIST) as fDist from Flights F join Destinations D ON F.DID = D.DID GROUP BY F.AID,F.DID; 

我的問題是我不知道如何將它們結合起來,找到解決方案。我知道我需要做的是找出一種方法來檢查目的地的平均距離是否小於單個飛機飛行的距離,但我不知道如何繼續。我所有的有條款似乎不起作用,所以我現在有點卡住了。

回答

1

這並不難與分析功能:

SELECT DISTINCT AID FROM (
    SELECT F.AID, D.DID, 
      AVG(F.DIST) OVER (PARTITION BY D.DID) as AvgDist, 
      SUM(F.DIST) OVER (PARTITION BY F.AID, D.DID) as AirDistance 
    FROM Destinations D join Flights F ON F.DID = D.DID 
) WHERE AirDistance > AvgDist; 

隨着你的子查詢應該是這樣的:

SELECT DISTINCT a.AID 
FROM 
    (SELECT D.DID, AVG(F.DIST) as AvgDist 
    FROM Destinations D join Flights F 
     ON F.DID = D.DID GROUP BY D.DID 
    ) d 
    JOIN  
    (SELECT F.AID,F.DID, SUM(F.DIST) as fDist 
    FROM Flights F join Destinations D 
      ON F.DID = D.DID GROUP BY F.AID,F.DID 
    ) a 
    ON d.DID = a.DID 
WHERE fDist > AvgDist;  
+0

從來沒有聽說過的分區,我得看看這件事。 – sealsix 2014-11-05 17:09:56

+0

是否有另一種方法來做到這一點而不分區表?或者這是做這種查詢最常用的方法嗎? – sealsix 2014-11-05 17:12:01

+0

@sealsix通過分析功能可以減少操作 – Multisync 2014-11-05 17:13:33