【问题标题】:Oracle 18c - ERROR CREATING MATERIALIZED VIEW - ORA-00933Oracle 18c - 创建实体化视图时出错 - ORA-00933
【发布时间】:2020-05-29 19:00:20
【问题描述】:

我尝试在 oracle 18c 上创建物化视图,但得到了 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
);

有什么我没见过的吗?提前谢谢你

【问题讨论】:

    标签: oracle18c


    【解决方案1】:

    看起来像一个旧的语法解析器错误。将查询括在括号中,如下所示:

    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.
    

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 2016-08-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多