none
AYUDA: Vista materializada RRS feed

  • 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
    jueves, 21 de mayo de 2020 20:28

Todas las respuestas

  • Hola,

     

    Gracias por levantar tu consulta en los foros de MSDN. Estamos analizando su pregunta y vamos a darle seguimiento para buscar la mejor repuesta pertinente al caso.

     

    Gracias por usar los foros de MSDN.

     


    Eric Ruiz

    jueves, 21 de mayo de 2020 23:53
  • Hola

    ¿Y que resultado le da al realizar un SELECT sobre esa vista?

    ¿Que version de SQL Server maneja?


    IIslas Master Consultant SQL Server

    viernes, 22 de mayo de 2020 0:50
  • 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.

    https://docs.microsoft.com/es-es/sql/t-sql/statements/create-materialized-view-as-select-transact-sql?view=azure-sqldw-latest

    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/

    viernes, 22 de mayo de 2020 3:44
  • 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.

    viernes, 22 de mayo de 2020 8:31