2013-10-24 26 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