我是一个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。
由于
答案 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