使用外连接难点
问题描述:
我有问题使用外连接写这个问题的查询。我可以在没有外连接的情况下写这个,但是它给外连接带来一些困难。使用外连接难点
问:
有关“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;
任何建议和帮助,将不胜感激。
答
您想要加入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
我删除了Oracle标签,因为SQL小提琴使用的Postgres。 –
@GordonLinoff你可以看看这个问题。我真的被困在这。 –
什么对您的查询不起作用?错误?不想要的结果? 2018年的明年1月1日真的吗?此外,什么非外部查询的作品?请张贴它。 – Parfait