2

我是一个 SQL 初学者,我需要弄清楚这个查询:我有三个表连接在一起,我从中计算某个值,如下所示:

SELECT SEATS_MAX-COUNT(BOOKING_ID) 
FROM FLIGHTS 
  INNER JOIN PLANES ON FLIGHTS.PLANE_ID=PLANES.PLANE_ID 
  LEFT JOIN BOOKINGS ON FLIGHTS.FLIGHT_ID=BOOKINGS.FLIGHT_ID 
GROUP BY SEATS_MAX;

这将返回航班中的免费座位数。但我想从 FLIGHTS 中获取所有列(如SELECT * FROM FLIGHTS;)加上计数。即类似的东西

SELECT FLIGHTS.*, SEATS_MAX-COUNT(BOOKING_ID) 
FROM FLIGHTS 
  INNER JOIN PLANES ON FLIGHTS.PLANE_ID=PLANES.PLANE_ID 
  LEFT JOIN BOOKINGS ON FLIGHTS.FLIGHT_ID=BOOKINGS.FLIGHT_ID 
GROUP BY SEATS_MAX;

但这不起作用(无效的 user.table.column、table.column 或列规范)。有没有办法做到这一点?我正在使用 Oracle 数据库。

谢谢

4

3 回答 3

4

在 group by 中,您需要不聚合所有列。

所以你的查询必须变成:

      SELECT FLIGHTS.*, 
             SEATS_MAX-COUNT(BOOKING_ID) 
        FROM FLIGHTS 
  INNER JOIN PLANES 
          ON FLIGHTS.PLANE_ID = PLANES.PLANE_ID 
   LEFT JOIN BOOKINGS 
          ON FLIGHTS.FLIGHT_ID = BOOKINGS.FLIGHT_ID 
    GROUP BY FLIGHTS.Column1,
             ...
             FLIGHTS.ColumN,
             SEATS_MAX;

编辑: 要列出您表的所有列,您可以使用以下查询

  SELECT 'FLIGHTS.' || column_name
    FROM user_tab_columns
   WHERE table_name = 'FLIGHTS'
ORDER BY column_id;

这应该会让你的生活更轻松,然后复制和粘贴

于 2013-10-24T21:55:14.400 回答
0

这对于 sql 初学者来说是一个常见的错误。请注意,当您在某些列(在您的情况下为 SEATS_MAX)上使用 group by 子句时,大多数数据库不允许您在 select 子句中添加其他列,除了 SEATS_MAX 上的聚合,例如 count(SEATS_MAX)、max(SEATS_MAX) 和很快。

这是因为您的数据已按 SEATS_MAX 分组,因此结果集基于每个组。对于具有相同 SEATS_MAX 值的一组数据,Flight 表的列 (FLIGHTS.*) 的值不一定相同。因此,数据库不知道要返回哪些值。

于 2013-10-24T22:03:11.253 回答
0

这应该有效:

选择航班。*,seats_max-booked_seats
    FROM 航班,(SELECT COUNT(*)booked_seats,flight_id
                     FROM bookings GROUP BY flight_id) 预订
    WHERE flight.flight_id = book.flight_id
于 2013-10-24T23:04:39.403 回答