2011-12-08 11 views
85

Ho due tabelle e devo creare una vista. Le tabelle sono:La vista SELECT contiene una sottoquery nella clausola FROM

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

Per eseguire questa operazione, utilizzare la seguente query. La query senza la parte "create view" funziona bene ma con "create view", mostra l'errore "View's SELECT contiene una sottoquery nella clausola FROM". Quale potrebbe essere la possibile soluzione problema &:

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

possibile duplicato di [MySQL: Visualizza con sottoquery nella limitazione della clausola FROM] (http://stackoverflow.com/questions/206062/mysql-view-with-subquery-in-the-from-clause-limitation) –

+0

@MattFenwick, no non lo è - la query può essere riscritta facilmente, il che non è possibile in generale – TMS

+0

Le sottoquery sono supportate in mariadb '10.2' dalla versione' 10.2.1' See - https://jira.mariadb.org/browse/MDEV-3944 –

risposta

130

Come da documentazione:

MySQL Docs

  • L'istruzione SELECT non può contenere un subquery nella clausola FROM.

La soluzione alternativa sarebbe creare una vista per ciascuna subquery.

Poi accedere a tali viste dal all'interno della vostra vista view_credit_status

+14

Si noti che le visualizzazioni di nidificazione possono causare gravi penalizzazioni delle prestazioni. – miguelcobain

+1

@miguelcobain, la creazione di una nuova vista solo per nidificare non rimuove le "penalità di prestazioni serie" di cui si sta parlando. Quindi cosa dà? – Pacerier

+16

Ora consentito in 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

Come la recente documentazione più MySQL su view restrictions dice:

Prima di MySQL 5.7.7, subqueries non possono essere utilizzati nella clausola FROM di vista

Ciò significa che la scelta di un MySQL v5.7.7 o successivo o l'aggiornamento dell'istanza MySQL esistente a tale versione rimuovono completamente questa restrizione sulle viste.

Tuttavia, se si dispone di una versione di MySQL di produzione corrente precedente alla v.7.7, la rimozione di questa restrizione sulle viste dovrebbe essere solo uno dei criteri da valutare durante la decisione di aggiornamento o meno. L'utilizzo delle tecniche di soluzione alternative descritte nelle altre risposte potrebbe essere una soluzione più valida, almeno nella corsa più breve.

0

Mi sembra che MySQL 3.6 restituisca il seguente errore mentre MySQL 3.7 non causa più errori. Devo ancora trovare qualcosa nella documentazione riguardante questa correzione.

Problemi correlati