entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Errores al crear una vista a partir de una consulta correcta en Mysql

Hola a todos, estoy tratando de crear una vista en una base de datos, el select de la vista tiene subquerys dentro del FROM, por eso he tenido que actualizar MySql a la ultima versión 5.7, en la que ya si se permite hacer esto, así que eso no debería ser la causa del error.

El caso es que la consulta que genera la vista, si la pruebo por separado funciona pero al intentar generar la vista a partir de ella me da varios problemas. La consulta es esta:

SELECT TBL.ID, TBL.PRODUCTO,TBL.TIPO,TBL.CANTIDAD,TBL.CREATED_BY,TBL.FECHA FROM 
    (
        ( SELECT ael.ID AS ID,ael.producto_id as PRODUCTO, 'ALBARAN DE ENTREGA' AS TIPO, ael.CANTIDAD AS CANTIDAD , ael.CREATED_BY AS CREATED_BY, ae.FECHA AS FECHA FROM ges_albaran_entrega_lineas ael INNER JOIN ges_albaran_entrega ae on ael.PARENT_ID = ae.ID ) 
        UNION ALL 
        ( SELECT al.ID AS ID,al.producto_id as PRODUCTO, 'ALBARAN DE RECEPCION' AS TIPO, al.CANTIDAD AS CANTIDAD, al.CREATED_BY AS CREATED_BY, a.FECHA AS FECHA FROM ges_albaran_lineas al INNER JOIN ges_albaran a on al.PARENT_ID = a.ID ) 
    ) AS TBL ORDER BY TBL.FECHA

Pero al intentar crear la vista me lanza varios errores:

CREATE
    OR REPLACE
    VIEW gestion.VIEW_GES_MOV_PRODUCTO 
    AS 
    SELECT TBL.ID, TBL.PRODUCTO,TBL.TIPO,TBL.CANTIDAD,TBL.CREATED_BY,TBL.FECHA FROM 
    (
        ( SELECT ael.ID AS ID,ael.producto_id as PRODUCTO, 'ALBARAN DE ENTREGA' AS TIPO, ael.CANTIDAD AS CANTIDAD , ael.CREATED_BY AS CREATED_BY, ae.FECHA AS FECHA FROM ges_albaran_entrega_lineas ael INNER JOIN ges_albaran_entrega ae on ael.PARENT_ID = ae.ID ) 
        UNION ALL 
        ( SELECT al.ID AS ID,al.producto_id as PRODUCTO, 'ALBARAN DE RECEPCION' AS TIPO, al.CANTIDAD AS CANTIDAD, al.CREATED_BY AS CREATED_BY, a.FECHA AS FECHA FROM ges_albaran_lineas al INNER JOIN ges_albaran a on al.PARENT_ID = a.ID ) 
    ) AS TBL ORDER BY TBL.FECHA

Estoy utilizando phpMyAdmin como consola SQL, los errores que lanza son estos:

Error-1: Se esperaba una expresión. (near "(" at position 164)
Error-2: Símbolo (token) inesperado. (near "(" at position 164)
Error-3: Símbolo (token) inesperado. (near "(" at position 165)
Error-4: Este tipo de cláusula se analizó previamente. (near "SELECT" at position 166)
Error-5: Este tipo de cláusula se analizó previamente. (near "SELECT" at position 427)

A ver si alguien puede decirme que esta pasando.

1 Respuesta

4votos

bl4z3r Puntos16850

Por lo que veo, el problema esta en los paréntesis de mas que están en las sub-consultas. Debería quedarte algo así:

SELECT
    TBL.ID,
    TBL.PRODUCTO,
    TBL.TIPO,
    TBL.CANTIDAD,
    TBL.CREATED_BY,
    TBL.FECHA
FROM 
    (
        SELECT
            ael.ID AS ID,
            ael.producto_id as PRODUCTO,
            'ALBARAN DE ENTREGA' AS TIPO,
            ael.CANTIDAD AS CANTIDAD,
            ael.CREATED_BY AS CREATED_BY,
            ae.FECHA AS FECHA
        FROM
            ges_albaran_entrega_lineas AS ael
            INNER JOIN ges_albaran_entrega ae
                on ael.PARENT_ID = ae.ID 
        UNION ALL 
        SELECT
            al.ID AS ID,
            al.producto_id as PRODUCTO,
            'ALBARAN DE RECEPCION' AS TIPO,
            al.CANTIDAD AS CANTIDAD,
            al.CREATED_BY AS CREATED_BY,
            a.FECHA AS FECHA
        FROM
            ges_albaran_lineas AS al
            INNER JOIN ges_albaran a
                on al.PARENT_ID = a.ID
    ) AS TBL
ORDER BY
    TBL.FECHA;

Actualización 1:

¿Por que no andan con los paréntesis las sub-consultas internas?
Esto se debe a como funcionan los paréntesis. En SQL hay que ser cuidado a la hora de agregar cosas. Por ejemplo; si yo tomaba tu consulta sola y la ejecutaría me daría error por que no le estoy indicando la operación que quiero realizar y solamente estoy indicando el conjunto a consultar.

(SELECT -- !!! Error en esta linea !!!
    ...
UNION ALL 
SELECT
    ...);

Y para que esta consulta funcione, tendría que agregar otro SELECT mas, de la siguiente manera:

SELECT
    (SELECT
        ...
    UNION ALL 
    SELECT
        ...);

Y de esa manera me mostraría lo que vos querías realizar.

0voto

Javi2EE comentado

Hola bl4z3r, por los errores parece que sean los paréntesis pero ya probé a quitarlos, utilizando la consulta de la respuesta para crear la vista se elimina el error 1 pero el resto continúan.

2votos

Javi2EE comentado

Llevabas razón, era eso que has comentado, lo raro es que funcionase por separado y además había otro error, el nombre de la base de datos en el create view estaba mal por una equivocación. Muchas gracias compañero ya esta solucionado

2votos

bl4z3r comentado

@Javi2EE ahí actualice la pregunta para que entiendas el por que no anduvo tu consulta.

0voto

Javi2EE comentado

Gracias por la info @bl4z3r

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta