2014-10-08 86 views
0

现在的问题是:您想成为第一个为航班预订和选择座位的人。查找所有没有预订的航班的flight_num和日期。SQL查询:寻找空

从以下表:

  • Flightsflight_num, source_city, dest_city
  • Departuresflight_num, date, plane_type
  • Passengerspassenger_id, passenger_name, passenger_address
  • Bookingspassenger_id, flight_num, date, seat_number

我的回答是:

SELECT D.flight_num, D.date 
FROM DEPARTURES D, BOOKINGS B 
WHERE B.passenger_id = NULL 

我知道这是错误的,但谁能告诉我为什么?这是什么答案?

+6

除了其他的事情,你希望'是null'来检查空值。 – 2014-10-08 18:06:07

+5

[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 在ANSI - ** 92 ** SQL标准(**超过20年前的**)中,旧式*逗号分隔的表*样式列表被替换为* proper * ANSI'JOIN'语法它的使用是不鼓励的。现在,如果没有**任何**连接条件,您基本上会得到一个**笛卡尔产品** - 每个行中的'Departures'与'Bookings'中的每一行相结合 - 最有可能**不是**您需要的! – 2014-10-08 18:07:31

+3

你是从课本中还是从书中学到的?如果是这样,升级或退款的时间。我认为这些旧式的连接是罗马人发明的。 – GolezTrol 2014-10-08 18:08:15

回答

1

这可能会更好:

SELECT D.flight_num, D.date 
FROM DEPARTURES D JOIN BOOKINGS B ON D.flight_num = B.flight_num 
WHERE B.passenger_id IS NULL 

我不知道是否有可能预订,但不预留座位号。如果是这样,那么你需要为此更改WHERE子句。

0

这可能有效吗?

SELECT D.flight_num, D.date 
    FROM Departures D LEFT OUTER JOIN Bookings B 
    WHERE B.passenger_id IS NULL