it-swarm.com.de

View's SELECT enthält eine Unterabfrage in der FROM-Klausel

Ich habe zwei Tabellen und muss eine Ansicht erstellen. Die Tabellen sind:

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

Ich verwende dazu die folgende Abfrage. Die Abfrage ohne den Teil "Ansicht erstellen" funktioniert gut, aber mit "Ansicht erstellen" wird der Fehler "SELECT's View enthält eine Unterabfrage in der FROM-Klausel" angezeigt. Was könnte das Problem und mögliche Lösung sein:

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)
99
Raouf Athar

Wie in der Dokumentation: 

MySQL-Dokumente

  • Die SELECT-Anweisung darf keine Unterabfrage in der FROM-Klausel enthalten.

Sie können dieses Problem umgehen, indem Sie für jede Ihrer Unterabfragen eine Ansicht erstellen.

Greifen Sie dann auf diese Ansichten in Ihrer Ansicht zu. view_credit_status

144
Nonym
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)
15
Michał Powaga

Wie die neuere MySQL-Dokumentation zu Einschränkungen anzeigen sagt:

Vor MySQL 5.7.7 können Unterabfragen nicht in der FROM-Klausel einer Sicht verwendet werden. 

Wenn Sie also ein MySQL v5.7.7 oder neuer wählen oder ein Upgrade der vorhandenen MySQL-Instanz auf eine solche Version durchführen, wird diese Einschränkung für Ansichten vollständig aufgehoben.

Wenn Sie jedoch über eine aktuelle MySQL-Produktionsversion verfügen, die älter als v5.7.7 ist, sollte das Entfernen dieser Einschränkung für Ansichten nur eines der Kriterien sein, die bei der Entscheidung über ein Upgrade beurteilt werden oder nicht. Das Verwenden der in den anderen Antworten beschriebenen Problemumgehungstechniken kann eine praktikabelere Lösung sein - zumindest auf kurze Sicht.

12
Shadow

Sieht aus wie MySQL 3.6 den folgenden Fehler ausgibt, während MySQL 3.7 nicht mehr fehlerhaft ist Ich habe noch nichts in der Dokumentation zu diesem Fix gefunden.

0
user3809638