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

111

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 benutze die folgende Abfrage, um dies zu tun. Die Abfrage ohne den Teil "Ansicht erstellen" funktioniert gut, aber mit "Ansicht erstellen" wird der Fehler "SELECT der Ansicht enthält eine Unterabfrage in der FROM-Klausel" angezeigt. Was könnte das Problem und die 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)
Raouf Athar
quelle
@ MattFenwick, nein, ist es nicht - diese Abfrage kann leicht umgeschrieben werden, was im Allgemeinen nicht möglich ist
TMS
Unterabfragen werden in Mariadb 10.2von der Version 10.2.1See - jira.mariadb.org/browse/MDEV-3944
Adarsh ​​Madrecha

Antworten:

156

Gemäß Dokumentation:

MySQL Docs

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

Ihre Problemumgehung besteht darin, eine Ansicht für jede Ihrer Unterabfragen zu erstellen.

Greifen Sie dann von Ihrer Ansicht aus auf diese Ansichten zu view_credit_status

Nonym
quelle
17
Beachten Sie, dass das Verschachteln von Ansichten schwerwiegende Leistungseinbußen verursachen kann.
Miguelcobain
1
@miguelcobain, Wenn Sie eine neue Ansicht erstellen, um sie nur zu verschachteln, werden die "schwerwiegenden Leistungseinbußen", von denen Sie sprechen, nicht beseitigt. Also, was gibt es?
Pacerier
28
Jetzt in 5.7 erlaubt! :-)
François Breton
4
Nicht in MariaDB erlaubt entweder
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
quelle
13

In der neueren MySQL-Dokumentation zu Anzeigeeinschränkungen heißt es:

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

Dies bedeutet, dass die Auswahl von MySQL v5.7.7 oder neuer oder das Aktualisieren der vorhandenen MySQL-Instanz auf eine solche Version diese Einschränkung für Ansichten vollständig aufheben würde.

Wenn Sie jedoch über eine aktuelle MySQL-Produktionsversion verfügen, die älter als Version 5.7.7 ist, sollte die Aufhebung dieser Einschränkung für Ansichten nur eines der Kriterien sein, die bewertet werden, wenn Sie entscheiden, ob ein Upgrade durchgeführt werden soll oder nicht. Die Verwendung der in den anderen Antworten beschriebenen Problemumgehungstechniken kann - zumindest kurzfristig - eine praktikablere Lösung sein.

Schatten
quelle
0

Sieht für mich so aus, als ob MySQL 3.6 den folgenden Fehler ausgibt, während MySQL 3.7 keine Fehler mehr ausgibt. Ich habe noch nichts in der Dokumentation zu diesem Fix gefunden.

user3809638
quelle