2014-11-05 40 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