Oracle 18 c - ОШИБКА СОЗДАНИЯ МАТЕРИАЛИЗОВАННОГО ВИДА - ORA-00933 - PullRequest
0 голосов
/ 29 мая 2020

Я попытался создать материализованное представление на oracle 18 c и получил ORA-00933.

CREATE MATERIALIZED VIEW Top10Cancelacion
BUILD IMMEDIATE
REFRESH ON DEMAND 
AS SELECT idAeropuerto 
FROM aeropuerto 
ORDER BY (  SELECT count(*)
            FROM vuelo v JOIN incidencia i
                ON v.idVuelo = i.idVuelo
            WHERE (idAeropuerto = v.origen OR
                    idAeropuerto = v.destino) AND
                i.tipo = 'Cancelado'
        )/( SELECT count(*) FROM vuelo )
    DESC
FETCH FIRST 10 ROWS ONLY;

Я попытался удалить строку FETCH FIRST и ORDER BY, но У меня такая же ошибка. Я попытался выполнить запрос, и он работает без проблем. Несмотря на это, это моя структура базы данных важных частей:

CREATE TABLE Aeropuerto(
        idAeropuerto    VARCHAR2(4),
        nombre          VARCHAR2(100),
        ciudad          VARCHAR2(100),
        estado          VARCHAR2(100),
        pais            VARCHAR2(100),
        latitud         DECIMAL(11,8),
        longitud        DECIMAL(11,8),
        PRIMARY KEY (idAeropuerto)
);
CREATE TABLE Vuelo(
    idVuelo         NUMBER,
    origen          VARCHAR2(4),
    destino         VARCHAR2(4),
    avion           VARCHAR2(10),
    tiempoOrigen    TIMESTAMP,
    tiempoDestino   TIMESTAMP,
    duracion        NUMBER,
    distancia       NUMBER,
    PRIMARY KEY (idVuelo),
    FOREIGN KEY (origen) REFERENCES Aeropuerto(idAeropuerto) ON DELETE CASCADE,
    FOREIGN KEY (destino) REFERENCES Aeropuerto(idAeropuerto) ON DELETE CASCADE,
    FOREIGN KEY (avion) REFERENCES Avion(idAvion) ON DELETE CASCADE,
    CONSTRAINT distinct_places CHECK (origen != destino)
);
CREATE TABLE Incidencia(
    idVuelo NUMBER,
    tipo    VARCHAR2(100),
    detalles VARCHAR2(100),
    PRIMARY KEY (idVuelo, tipo),
    FOREIGN KEY (idVuelo) REFERENCES Vuelo(idVuelo) ON DELETE CASCADE
);

Есть что-то, чего я не видел? Заранее спасибо

1 Ответ

1 голос
/ 30 мая 2020

Похоже, старая ошибка парсера синтаксиса. Заключите запрос в скобки, например:

SQL> CREATE MATERIALIZED VIEW Top10Cancelacion
BUILD IMMEDIATE
REFRESH ON DEMAND 
AS (SELECT idAeropuerto 
FROM aeropuerto 
ORDER BY (  SELECT count(*)
            FROM vuelo v JOIN incidencia i
                ON v.idVuelo = i.idVuelo
            WHERE (idAeropuerto = v.origen OR
                    idAeropuerto = v.destino) AND
                i.tipo = 'Cancelado'
        )/( SELECT count(*) FROM vuelo )
    DESC
FETCH FIRST 10 ROWS ONLY);

Materialized view created.
...