SELECT de la vista contiene una subconsulta en la cláusula FROM


111

Tengo dos tablas y necesito crear una vista. Las tablas son:

credit_orders(id, client_id, number_of_credits, payment_status)
credit_usage(id, client_id, credits_used, date)

Utilizo la siguiente consulta para hacer esto. La consulta sin la parte "crear vista" funciona bien, pero con "crear vista", muestra el error "La vista SELECT contiene una subconsulta en la cláusula FROM". ¿Cuál podría ser el problema y la posible solución?

create view view_credit_status as 
(select credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
 from credit_orders
 left outer join (select * from (select credit_usage.client_id, 
                                        sum(credits_used) as credits_used 
                                 from credit_usage 
                                 group by credit_usage.client_id) as t0
                  ) as t1 on t1.client_id = credit_orders.client_id
 where credit_orders.payment_status='Paid'
 group by credit_orders.client_id)


@MattFenwick, no, no lo es, esa consulta se puede reescribir fácilmente, lo cual no es posible en general
TMS

Las subconsultas son compatibles con mariadb 10.2desde la versión 10.2.1Ver - jira.mariadb.org/browse/MDEV-3944
Adarsh ​​Madrecha

Respuestas:


157

Según documentación:

Documentos de MySQL

  • La instrucción SELECT no puede contener una subconsulta en la cláusula FROM.

Su solución alternativa sería crear una vista para cada una de sus subconsultas.

Luego acceda a esas vistas desde su vista view_credit_status


17
Tenga en cuenta que las vistas anidadas pueden provocar graves penalizaciones de rendimiento.
miguelcobain

1
@miguelcobain, Crear una nueva vista solo para anidarla no elimina las "graves penalizaciones de rendimiento" de las que está hablando. Entonces, ¿qué da?
Pacerier

28
¡Ahora permitido en 5.7! :-)
François Breton

4
Tampoco se permite en MariaDB
peter

16
create view view_clients_credit_usage as
    select client_id, sum(credits_used) as credits_used 
    from credit_usage 
    group by client_id

create view view_credit_status as 
    select 
        credit_orders.client_id, 
        sum(credit_orders.number_of_credits) as purchased, 
        ifnull(t1.credits_used,0) as used 
    from credit_orders
    left outer join view_clients_credit_usage as t1 on t1.client_id = credit_orders.client_id
    where credit_orders.payment_status='Paid'
    group by credit_orders.client_id)

13

Como dice la documentación de MySQL más reciente sobre restricciones de vista :

Antes de MySQL 5.7.7, las subconsultas no se pueden usar en la cláusula FROM de una vista.

Esto significa que elegir un MySQL v5.7.7 o más reciente o actualizar la instancia de MySQL existente a dicha versión eliminaría esta restricción en las vistas por completo.

Sin embargo, si tiene una versión de producción actual de MySQL anterior a la v5.7.7, la eliminación de esta restricción en las vistas solo debe ser uno de los criterios que se evalúan al tomar la decisión de actualizar o no. El uso de las técnicas de solución alternativa descritas en las otras respuestas puede ser una solución más viable, al menos a corto plazo.


0

Me parece que MySQL 3.6 da el siguiente error, mientras que MySQL 3.7 ya no produce errores. Todavía tengo que encontrar algo en la documentación con respecto a esta solución.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.