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