Oracle 18c - 创建物化视图时出错 - ORA-00933
Oracle 18c - ERROR CREATING MATERIALIZED VIEW - ORA-00933
我试图在 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
);
有什么我没见过的吗?提前谢谢你
看起来像是一个旧的语法分析器错误。将查询括在括号中,如下所示:
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.
我试图在 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
);
有什么我没见过的吗?提前谢谢你
看起来像是一个旧的语法分析器错误。将查询括在括号中,如下所示:
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.