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)
Raouf Athar
fuente
@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

Nónimo
fuente
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)
Michał Powaga
fuente
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.

Sombra
fuente
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.

usuario3809638
fuente