2017-10-08 10 views
1

外部結合を使用してこの質問のクエリを書く際に問題が発生しています。私は外部結合なしでこれを書くことができますが、それは私に外部結合でいくつかの困難な時間を与えます。外部結合を使用するのが難しい

質問:「2018年1月1日」に関する各フライトの

、(外部結合を使用して)まだ予約されていない座席のすべてを見つけます。自由座席ごとに、フライト番号と座席番号を表示してください。

私は以下の表を持っている:

create table passenger ( 
    passenger_ID varchar (10) , 
    passenger_name varchar (30) , 
    passenger_city varchar (30) , 
    primary key (passenger_ID)) ; 

create table flight ( 
    flight_number varchar (10) , 
    departure_airport varchar (10), 
    arrival_airport varchar (10) , 
    primary key (flight_number)); 

create table seat ( 
flight_number varchar (10), 
seat_number varchar (10), 
primary key(flight_number, seat_number), 
foreign key(flight_number) references flight); 

create table reservation(
    passenger_ID varchar (10), 
         flight_number varchar (10), 
         seat_number varchar (10), 
         day date , 
         fare numeric(8,2), 
primary key (flight_number, seat_number,day), 
foreign key (flight_number, seat_number) references seat , 
foreign key (passenger_ID) references passenger); 

このSQLフィドルをご覧下さい。私はスキーマを構築しました。 [http://sqlfiddle.com/#!17/feaca/1

私が今持っているクエリは次のとおりです。

Select distinct a.flight_number , a.seat_number 
from 
seat a 
left outer join 
reservation b 
on 
a.flight_number = b.flight_number 
and 
a.seat_number <> b.seat_number 
where b.day = to_date('2017-10-01','YYYY-MM-DD') 
order by 1; 

任意の提案やヘルプは高く評価されます。

+0

SQLのフィドルはPostgresのを使用していますので、私はOracleのタグを削除しました。 –

+0

@ GordonLinoffこの問題を見てください。私は本当にこれにこだわりました。 –

+0

あなたのクエリについては何が問題になりませんか?エラー?望ましくない結果はありますか?そして、それは本当に来年の1月1日、2018ですか?また、どの外部クエリでも機能しますか?投稿してください。 – Parfait

答えて

1

flight_number、seat_number、および指定された日付に参加する必要があります。次に、予約に対応する行がない行を除外することができます。

Select distinct s.flight_number , s.seat_number 
from seat s 
left outer join reservation r 
    on r.flight_number = s.flight_number 
    and r.seat_number = s.seat_number 
    and r.day = to_date('2017-10-01','YYYY-MM-DD') 
join (
    select distinct flight_number 
    from reservation 
    where day = to_date('2017-10-01','YYYY-MM-DD') 
) r2 on s.flight_number = r2.flight_number 
where r.day is null 
order by 1; 

またはINを使用する:

Select distinct s.flight_number , s.seat_number 
from seat s 
left outer join reservation r 
    on r.flight_number = s.flight_number 
    and r.seat_number = s.seat_number 
    and r.day = to_date('2017-10-01','YYYY-MM-DD') 
where r.day is null 
and s.flight_number in (
    select flight_number 
    from reservation 
    where day = to_date('2017-10-01','YYYY-MM-DD') 
    ) 
order by 1; 
+0

この左の外部結合は、飛行A1の記録を返します。 A1便は2017-10-01の予約がありません。 –

+0

@SujanShrestha - 答えを更新しました。今すぐお試しください – GurV

関連する問題