Usuario
AYUDA: Vista materializada

Pregunta
-
AYUDA NO ESTOY SEGURO DE LO QUE HICE Y DUDO MUCHO QUE ES CORRECTO AYUDA PORFAVOR!
create table despachos(
numero int primary key,
capacidad int
);
create table directores(
dni varchar(8) primary key,
nomapels varchar(50),
dnijefe varchar(8),
despacho int,
constraint fkdire_despa foreign key (despacho) references despachos,
constraint fkdire_dire foreign key (dnijefe) references directores
);
Vista materializada que muestre el dni, nombre de directores y
números de despacho, de los directores que ocupan los despachos
con capacidad mayor al promedio
HICE ESTO:
CREATE MATERIALIZED VIEW DIRDESPAPROM AS
SELECT DIR.DNI,DIR.NOMBRE,DES.NUMERO
FROM DIRECTORES DIR
JOIN DESPACHO DES ON DIR.DESPACHO=DES.NUMERO
HAVING COUNT(DES.NUMERO)=(SELECT AVG(COUNT (NUMERO))
FROM DESPACHOS
GROUP BY NUMER0)
GROUP BY DIR.DNI,DIR.NOMBRE,DES.NUMERO;
NOSE SI ESTA BUENO,NO SABIA BIEN COMO HACERLO. NECESITO AYUDA PLS
Todas las respuestas
-
-
-
Hola AYUDA Vista Materializada:
Supongo que su consulta correrá en un motor oracle y no en SQL Server, y las diferencias en cuanto a la misma pueden ser importantes.
Este es un foro de SQL Server si necesitas más ayuda puedes probar en uno del motor específico que estés utilizando. No obstante.
Te voy a poner una solución que te acerque un poco más a la misma.
CREATE VIEW DBO.DIRDESPAPROM AS SELECT D.dni, D.nomapels, D.numero FROM ( SELECT DIR.DNI,DIR.nomapels,DES.NUMERO, COUNT(DES.NUMERO) AS NUM, AVG(NUMERO) AS MEDIA FROM DIRECTORES DIR JOIN DESPACHOS DES ON DIR.DESPACHO=DES.NUMERO GROUP BY DIR.DNI,DIR.nomapels,DES.NUMERO HAVING COUNT(DES.NUMERO)>AVG(NUMERO) ) D
Como puedes ver te he quitado el Materialized, puesto que en SQL Server, esto solo aplica a Azure SQL DataWareHouse.
Pero la sentencia puede ser igual.
Te dejo un enlace sobre vistas materializadas en Oracle por si fuese necesario.
http://www.jipnet.com.ar/2018/04/07/vistas-materializadas-en-oracle-pl-sql-que-son-y-para-que-usarlas/
-
Si es SQL Server y lo que quieres es que la vista almacene sus contenidos, en lugar de ejecutar la consulta interna cada vez que consultas la vista, entonces lo que se hace es crearle un índice de tipo clustered, y eso hace que se almacene la vista en disco.
Quita la palabra "materialized", que no se usa en una vista en un SQL Server normal. Quita también el segundo "from", que es incorrecto en la sintaxis SQL.
Y después agrégale un índice: create clustered index idxLoQueSea on DIRDESPAPROM(dni,numero)
Si vas a hacer esto, lee primero la documentación porque hay algunos requisitos que tiene que cumplir la vista para poder indexarla. En particular, un requisito que no cumples es que hay que usar nombres de dos partes para las tablas (estás usando nombres de 1 parte) y otro requisito es que la vista tiene que crearse con la opción "with schemabinding" que no tienes puesta.