mysql - ejemplos - El SELECCIONAR de View contiene una subconsulta en la cláusula FROM
subconsultas oracle hr (4)
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)
Uso la siguiente consulta para hacer esto. La consulta sin la parte "crear vista" funciona bien, pero con "crear vista", muestra el error "SELECT de la vista 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)
Como dice la documentación más reciente de MySQL 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 MySQL v5.7.7 o posterior o actualizar la instancia existente de MySQL a dicha versión eliminaría por completo esta restricción en las vistas.
Sin embargo, si tiene una versión actual de MySQL de producción que es anterior a v5.7.7, entonces la eliminación de esta restricción en las vistas solo debe ser uno de los criterios que se evalúan mientras se toma la decisión de actualizar o no. Usar 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.
Me parece que MySQL 3.6 da el siguiente error mientras que MySQL 3.7 ya no se equivoca. Todavía tengo que encontrar algo en la documentación con respecto a esta solución.
Según la documentación:
- 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
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)