2

私は SQL の初心者で、このクエリを理解する必要があります。次のように、特定の値をカウントする 3 つのテーブルが結合されています。

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;

これは、フライトの空席数を返します。SELECT * FROM FLIGHTS;しかし、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句を使用する場合、ほとんどのデータベースでは、count(SEATS_MAX)、max(SEATS_MAX)などのSEATS_MAXでの集計を除いて、select句に他の列を追加できないことに注意してくださいすぐ。

これは、データが SEATS_MAX でグループ化されているため、結果セットは各グループに基づいているためです。同じ SEATS_MAX 値を持つデータのグループに対して、Flight テーブルの列 (FLIGHTS.*) の値は必ずしも同じではありません。したがって、データベースは返す値を認識できません。

于 2013-10-24T22:03:11.253 に答える