2011-12-08 20 views
85

Tengo dos tablas y necesito crear una vista. Las tablas son:El SELECT de la vista contiene una subconsulta en la cláusula FROM

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 "SELECT de la vista contiene una subconsulta en la cláusula FROM". ¿Cuál podría ser el problema & solución posible:

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) 
+0

posible duplicado de [MySQL: vista con subconsulta en la limitación de la cláusula FROM] (http://stackoverflow.com/questions/206062/mysql-view-with-subquery-in-the-from-clause-limitation) –

+0

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

+0

Las sub consultas son compatibles en mariadb '10.2' de la versión' 10.2.1' Ver - https://jira.mariadb.org/browse/MDEV-3944 –

Respuesta

130

De acuerdo con la documentación:

MySQL Docs

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

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

luego acceder a esas vistas desde dentro de su vista view_credit_status

+14

Tenga en cuenta que las vistas de anidamiento pueden causar serias penalizaciones de rendimiento. – miguelcobain

+1

@miguelcobain, la creación de una nueva vista solo para anidar no elimina las "graves penalizaciones de rendimiento" de las que está hablando. Entonces, ¿qué da? – Pacerier

+16

ahora permitido en 5.7! :-) –

13
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) 
5

Como la documentación más reciente de MySQL en view restrictions dice:

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

Esto significa que la elección de un MySQL v5.7.7 o posterior o la actualización de la instancia de MySQL existente a dicha versión eliminaría por completo esta restricción en las vistas.

Sin embargo, si tiene una versión de producción actual de MySQL 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 al tomar 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.

0

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

Cuestiones relacionadas