与表1相比,SELECT表2包含COUNT

时间:2015-05-06 18:17:44

标签: sql oracle

我有四张桌子:SCHED_FLIGHT,AIRCRAFT,PLANETYPE和RESERVATIONS。我想做这样的事情:

select S.SCHED_NO as "Scheduled Flight Number", P.CAPACITY - COUNT (SELECT * FROM RESERVATIONS R WHERE R.SCHED_NO = S.SCHED_NO) "Remaining Seats"
from PLANETYPE P, AIRCRAFT A, SCHED_FLIGHT S
where S.SERIAL_NO = A.SERIAL_NO and A.TYPE_NO = P.TYPE_NO;

如您所见,每个SCHEDULED_FLIGHT都有一个AIRCRAFT SERIAL_NO,每个AIRCRAFT都有一个PLANETYPE TYPE_NO,每个PLANETYPE都有不同的容量,因此,每个SCHED_FLIGHT都有一个基于飞机的容量,我想得到剩余座位的数量计算对该航班的预订次数。

当然代码不起作用,但我不知道如何解决这个问题。有什么提示吗?

编辑:我收到了一些答案,但首先我只是以两个表为例 - 但实际上涉及4个表,我必须包含一个where子句或多个连接...所以我还是困惑。我现在应该怎么做?看看我的代码。

2 个答案:

答案 0 :(得分:3)

更新: 我不确定所有列是否与您的真实列相对应,但此查询可能如下所示:

SELECT
    SF.SCHED_NO AS 'Scheduled Flight Number',
    SF.CAPACITY - COUNT (R.SCHED_NO) AS 'Remaining Seats'
FROM
(
    SELECT
        SF.SCHED_NO,
        P.CAPACITY
    FROM SCHEDULED_FLIGHT SF
    INNER JOIN AIRCRAFT A
    ON SF.AIRCRAFT_SERIAL_NO = A.SERIAL_NO
    INNER JOIN PLANETYPE P
    ON A.PLANETYPE_NO = P.PLANETYPE_NO
) SF
LEFT JOIN RESERVATIONS R
ON SF.SCHED_NO = R.SCHED_NO
GROUP BY SF.SCHED_NO, SF.CAPACITY

答案 1 :(得分:2)

我倾向于将此视为与join的聚合。首先,按航班号汇总预订。然后将其加入FLIGHT并计算剩余容量:

SELECT F.FLIGHT_NO, (F.CAPACITY - COALESCE(cnt, 0)) as Remaining
FROM FLIGHT F LEFT JOIN
     (SELECT R.FLIGHT_NO, COUNT(*) as cnt
      FROM RESERVATIONS R
      GROUP BY R.FLIGHT_NO
     ) R
     ON R.FLIGHT_NO = F.FLIGHT_NO;