【问题标题】:Join multiple tables, including one table twice, and sort by counting a group加入多个表,包括一个表两次,并通过计数一个组进行排序
【发布时间】:2012-04-17 20:31:00
【问题描述】:

我是一名业余爱好者,正试图完成他作业的最后一个问题(此时已过期,只是为了寻求理解)我在两天内坐下来尝试了近 5 个小时,并且已经完成了没有成功。

我尝试过查看所有不同类型的连接,但(永远)无法进行分组工作,并且在排序方面也没有运气。我可以一次做所有这些事情,但这里的困难是让所有这些事情协同工作。

这是问题:

编写一个 SQL 查询来检索具有(源城市、源代码、目标城市、 包含至少 2 个航班的所有源-目的地对的目的地代码和航班数)。命令 通过 number_of_flights。请注意,“航班”表中的“dest”和“source”属性 都引用了“airports”表中的“airportid”。

这是我必须使用的表(还附带了大约 3000 行虚拟条目)

create table airports (
    airportid char(3)       primary key, 
    city varchar(20)
);
create table airlines (
    airlineid char(2)       primary key, 
    name varchar(20), 
    hub char(3)             references airports(airportid)
); 
create table customers (
    customerid char(10)     primary key, 
    name varchar(25), 
    birthdate date, 
    frequentflieron char(2) references airlines(airlineid)
);
create table flights (
    flightid char(6)        primary key, 
    source char(3)          references airports(airportid), 
    dest char(3)            references airports(airportid), 
    airlineid char(2)       references airlines(airlineid), 
    local_departing_time date, 
    local_arrival_time date
);
create table flown (
    flightid char(6)        references flights(flightid), 
    customerid char(10)     references customers, 
    flightdate date
);

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

不是 GROUP BY 表达式

通常我很乐意尝试将这些拼凑在一起,但这令人沮丧。救命!

【问题讨论】:

  • 注意你应该把它标记为作业。

标签: sql oracle count group-by


【解决方案1】:
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;

【讨论】:

  • 这非常有效,而且几乎正是我想要的。我会研究这个,所以我完全理解它,非常感谢你的帮助!
  • 下面ericb的子查询方法更加优化,当flights表比airports表大得多时,执行速度更快,消耗的数据库资源(cpu,内存等)更少。
【解决方案2】:

您是否尝试过子查询?

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 子句限制为您要计算的内容(特别是源-目标对)。
  • 我实际上确实尝试过自己构建一些子查询,但没有完全理解它们,因此从未成功过。谢谢你的帖子!
  • @ScottC 如果这是家庭作业,您应该看看为什么在这种情况下子查询可能是比先执行所有连接更好的选择。子查询将在连接发生之前限制记录,使其成为可能更便宜的查询。
  • 我喜欢更便宜的查询的想法,但不完全理解你是如何做到的。我将不得不阅读更多关于子查询的内容
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2020-11-25
  • 2020-12-11
  • 2014-05-18
  • 1970-01-01
相关资源
最近更新 更多