2013-10-24 63 views
1

我是SQL初学者的一个表中选择的所有,我需要弄清楚这个查询:我有三个表连接在一起,从我要靠一定的价值,就像这样: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数据库。

谢谢

回答

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; 

这应该让您的生活有点更容易,然后复制和粘贴

+0

所以没有办法,我可以轻松地说:“名单从这个表,还要加上别的东西都列”?我必须明确指定所有列? –

+0

不是真的,你需要列出它们,我会添加一个小的查询,可以帮助你有一个列表可以工作的所有列 – mucio

0

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

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

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 
+0

,但它取决于SEATS_MAX是否在FLIGHTS表或PLANES表中。从OP的查询中不清楚,但我怀疑它在PLANES中。 – AndyDan