2012-04-17 11 views
0

をカウントすることによって、私は私が座ってちょうど彼の割り当ての彼の最後の質問を終了しようとしているアマチュア(それだけで理解を探して、この時点で延滞である)とショット午前これで2時間ほどで約5時間を試行し、成功しなかった。は二回1つのテーブルを含む、複数のテーブルを結合、およびソートグループ

私は(今まで)動作するようにグループ化することができませんでしたし、同様にソートして少し運を持っていた、参加するすべての異なる種類を見しようとしています。私はこれらのことすべてを一度に1つずつ行うことができますが、ここでの難しさはこれらすべてのものを組合で働かせることでした。

これは質問です:

は(ソース市、ソースコード、目的地の都市、 宛先コード、および数の-便)を持つリストを取得するために、SQLクエリを書くすべてのソース - について少なくとも2つのフライトとの目的地ペア。番号 をnumber_of_flightsで注文してください。 「フライト」テーブル の「dest」および「source」属性は、両方とも「airports」テーブルの「airportid」を参照していることに注意してください。

ここで私はと仕事をしなければならないテーブルがある

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を出力したに走った最初の問題(また、ダミーエントリのおよそ3000ラインに付属)異なる結果を示しています。それだけでなく、私はいつも同じ結果になるだろうグループ化するとき、私が試したものをどんなに:BY式

ないGROUPを

通常、私は楽しみが一緒にこれらをつなぎしようとしている必要がありますが、これは持っていますイライラした。助けて!

+0

あなたが宿題としてこれをタグ付けする必要があります注意してください。 – Randy

答えて

5
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; 
+0

これは完全に機能し、私が探しているものとほとんど同じです。私はこれを勉強していますので、私はそれを完全に理解しています、あなたの助けを大変ありがとう! –

+0

以下ericbによってサブクエリのアプローチは、より最適化され、より速く実行し、以下のデータベース・リソース(CPU、メモリ等)を消費することになる便テーブルは空港テーブルよりもはるかに大きいです。 –

4

サブクエリを試しましたか?

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 
+0

+1 GROUP BY句をカウントしているもの(具体的には、ソースとデスティネーションのペア)に限定するので、サブクエリのアプローチが好きです。 –

+0

私は実際に自分自身でいくつかのサブクエリを構築しようとしましたが、それらを完全には理解していなかったので、それは動作しませんでした。あなたのポストに感謝します! –

+0

@ScottCこれが宿題の場合は、最初にすべての結合を実行するよりも、このインスタンスでサブクエリが最適なオプションとなる理由を検討する必要があります。サブクエリは結合が起こる前にレコードを制限し、潜在的に安価なクエリにします。 – ericb

関連する問題