MariaDB вид с подзапросом - PullRequest
       5

MariaDB вид с подзапросом

0 голосов
/ 22 января 2019

для задания в нашем университете я должен создать представление для базы данных, но с ограничением, что это должен быть только один оператор. И эта часть заявления сейчас вызывает у меня головную боль.

Я создал это утверждение:

CREATE VIEW overbook_future_flights AS
SELECT 
    FlightNo,
    DepartureDateAndTimeUTC,
    ICAO_Code_Origin,
    ICAO_Code_Destination,
    PlaneID,
    NoOfSeats,
    NoOfReservedSeats AS NoReservedSeats
FROM (
    SELECT
        flightexecution.ICAO_Code_Origin,
        flightexecution.ICAO_Code_Destination,
        CURRENT_TIMESTAMP() AS nowUTC,
        SUM(NoReservedSeats) AS NoOfReservedSeats,
        flightexecution.DepartureDateAndTimeUTC,
        reservation.FlightNo,
        plane.PlaneID,
        plane.NoOfSeats
    FROM reservation
    INNER JOIN flightexecution ON
        flightexecution.FlightNo = reservation.FlightNo AND
        flightexecution.DepartureDateAndTimeUTC = reservation.DepartureDateAndTimeUTC
    INNER JOIN plane ON
        flightexecution.PlaneID = plane.PlaneID
    GROUP BY
        FlightNo,
        DepartureDateAndTimeUTC
    HAVING
        NoOfreservedSeats > NoOfSeats and
        nowUTC < DepartureDateAndTimeUTC
) AS a;

Но происходит сбой, поскольку create view не разрешает подзапросы в операторе from. Обычно я просто создаю несколько представлений и использую представление вместо подзапроса, но это должен быть только один оператор.

Кто-нибудь знает, возможно ли это задание решить? Если да, то как мне это решить?

1 Ответ

0 голосов
/ 23 января 2019

MySQL исторически (и, следовательно, MariaDB) не допускает подзапросов в FROM. К счастью, вам это не нужно:

CREATE VIEW overbook_future_flights AS
    SELECT fe.FlightNo, fe.DepartureDateAndTimeUTC,
           ?.ICAO_Code_Origin, ?.ICAO_Code_Destination, fe.PlaneID,
           p.NoOfSeats,
           SUM(r.NoReservedSeats) as NoOfReservedSeats
    FROM reservation r JOIN
         flightexecution fe
         ON fe.FlightNo = r.FlightNo AND
         fe.DepartureDateAndTimeUTC = r.DepartureDateAndTimeUTC JOIN
         plane p
         ON fe.PlaneID = p.PlaneID
    WHERE CURRENT_TIMESTAMP < DepartureDateAndTimeUTC
    GROUP BY fe.FlightNo, fe.DepartureDateAndTimeUTC,
             ?.ICAO_Code_Origin, ?.ICAO_Code_Destination, fe.PlaneID,
             p.NoOfSeats
    HAVING NoOfreservedSeats > p.NoOfSeats;

Введите соответствующий псевдоним для ?. У меня могут быть неправильные таблицы для некоторых, о которых я догадывался.

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • Укажите все имена столбцов с соответствующим псевдонимом.
  • Все неагрегированные столбцы должны быть в GROUP BY.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...