Sql 连接多个表,包括一个表两次,并按组计数排序

Sql 连接多个表,包括一个表两次,并按组计数排序,sql,oracle,count,group-by,Sql,Oracle,Count,Group By,我是一个业余爱好者,只是想完成他作业的最后一个问题(现在已经过期了,只是想了解一下)。我在两天的时间里坐了将近5个小时,试图解决这个问题,但都没有成功 我尝试过查看所有不同类型的联接,但无法使分组工作(从未),并且在排序方面也没有什么运气。我可以一次做所有这些事情,但这里的困难是让所有这些事情在联盟中发挥作用 问题是: 编写SQL查询以检索包含以下内容的列表(源城市、源代码、目标城市、, 至少有2个航班的所有源目的地对的目的地代码和航班数)。顺序 根据航班的数量。请注意,“flights”表中的

我是一个业余爱好者,只是想完成他作业的最后一个问题(现在已经过期了,只是想了解一下)。我在两天的时间里坐了将近5个小时,试图解决这个问题,但都没有成功

我尝试过查看所有不同类型的联接,但无法使分组工作(从未),并且在排序方面也没有什么运气。我可以一次做所有这些事情,但这里的困难是让所有这些事情在联盟中发挥作用

问题是:

编写SQL查询以检索包含以下内容的列表(源城市、源代码、目标城市、, 至少有2个航班的所有源目的地对的目的地代码和航班数)。顺序 根据航班的数量。请注意,“flights”表中的“dest”和“source”属性 都引用了“airportid”表中的“airportid”

以下是我必须处理的表(还附带了大约3000行伪条目)

我遇到的第一个问题是在同一个查询中两次输出airports.city,但结果不同。不仅如此,无论我在分组时尝试了什么,我都会得到相同的结果:

不是表达式的分组


通常情况下,我会很高兴地把它们拼凑在一起,但这一直令人沮丧。救命啊

您尝试过子查询吗

select source.airportid as source_airportid,
       source.city source_city,
       dest.airportid as dest_airportid,
       dest.city as dest_city,
       count(*) as flights
from   flights
inner join airports source on source.airportid = flights.source
inner join airports dest on dest.airportid = flights.dest
group by
       source.airportid,
       source.city,
       dest.airportid,
       dest.city
having count(*) >= 2
order by 5;
SELECT  source_airports.city, 
        source_airports.airportid,
        dest_airports.city,
        dest_airports.airportid,
        x.number_of_flights
FROM 
    (
        SELECT  source, dest, COUNT(*) as number_of_flights
        FROM    flights 
        GROUP BY source, dest
        HAVING COUNT(*) > 1
    ) as x
    INNER JOIN airports as dest_airports
    ON dest_airports.airportid = x.dest
    INNER JOIN airports as source_airports
    ON source_airports.airportid = x.source
ORDER BY x.number_of_flights ASC

请注意,您应该将其标记为家庭作业。+1我喜欢子查询方法,因为它将GROUP BY子句限制为您正在计算的内容(特别是源-目的地对)。实际上,我自己也尝试过构造一些子查询,但没有完全理解它们,因此它从未运行过。谢谢你的帖子@如果这是一个家庭作业,那么您应该看看为什么在这个实例中,子查询可能比首先执行所有连接更好。子查询将在连接发生之前限制记录,使其成为一个可能成本较低的查询。我喜欢成本较低的查询,但不完全理解您是如何做到这一点的。我将不得不在子问题中阅读更多内容。这很好地工作了,这正是我想要的。我将学习这个,所以我完全理解它,非常感谢你的帮助!下面ericb的子查询方法更优化,当flights表比airports表大得多时,执行速度更快,占用的数据库资源(cpu、内存等)更少。
SELECT  source_airports.city, 
        source_airports.airportid,
        dest_airports.city,
        dest_airports.airportid,
        x.number_of_flights
FROM 
    (
        SELECT  source, dest, COUNT(*) as number_of_flights
        FROM    flights 
        GROUP BY source, dest
        HAVING COUNT(*) > 1
    ) as x
    INNER JOIN airports as dest_airports
    ON dest_airports.airportid = x.dest
    INNER JOIN airports as source_airports
    ON source_airports.airportid = x.source
ORDER BY x.number_of_flights ASC