SQL从一个连接表表中选择所有

时间:2013-10-24 21:49:05

标签: sql oracle select

我是一个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 db。

由于

3 个答案:

答案 0 :(得分:2)

在组中,您需要将所有列都未聚合。

所以你的查询必须成为:

      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;

这应该让您的生活更轻松,然后复制并粘贴

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这应该有效:

SELECT flights.*, seats_max-booked_seats
    FROM flights, (SELECT COUNT(*) booked_seats, flight_id 
                     FROM bookings GROUP BY flight_id) book
    WHERE flights.flight_id = book.flight_id