2017-10-08 68 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

我刪除了Oracle標籤,因爲SQL小提琴使用的Postgres。 –

+0

@GordonLinoff你可以看看這個問題。我真的被困在這。 –

+0

什麼對您的查詢不起作用?錯誤?不想要的結果? 2018年的明年1月1日真的嗎?此外,什麼非外部查詢的作品?請張貼它。 – 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