SELECT View berisi subquery di klausa FROM


111

Saya memiliki dua tabel dan saya perlu membuat tampilan. Tabelnya adalah:

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

Saya menggunakan kueri berikut untuk melakukan ini. Kueri tanpa bagian "buat tampilan" berfungsi dengan baik tetapi dengan "buat tampilan", ini menunjukkan kesalahan "PILIH Tampilan berisi subkueri di klausa FROM". Apa yang bisa menjadi masalah & solusi yang mungkin:

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)


@MattFenwick, tidak - kueri itu dapat ditulis ulang dengan mudah, yang secara umum tidak mungkin
TMS

Subkueri didukung dalam mariadb 10.2dari versi 10.2.1Lihat - jira.mariadb.org/browse/MDEV-3944
Adarsh ​​Madrecha

Jawaban:


157

Sesuai dokumentasi:

Dokumen MySQL

  • Pernyataan SELECT tidak dapat berisi subquery di klausa FROM.

Solusi Anda adalah membuat tampilan untuk setiap subkueri Anda.

Kemudian akses tampilan tersebut dari dalam tampilan Anda view_credit_status


17
Perhatikan bahwa tampilan bertingkat dapat menyebabkan penalti performa yang serius.
miguelcobain

1
@miguelcobain, Membuat tampilan baru hanya untuk menyarangkannya tidak menghapus "hukuman kinerja serius" yang Anda bicarakan. Jadi apa yang menyebabkannya?
Pacerier

28
Sekarang diizinkan di 5.7! :-)
François Breton

4
Juga tidak diizinkan di MariaDB
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)

13

Seperti yang dikatakan dalam dokumentasi MySQL terbaru tentang batasan tampilan :

Sebelum MySQL 5.7.7, subkueri tidak dapat digunakan di klausa FROM tampilan.

Ini berarti, memilih MySQL v5.7.7 atau yang lebih baru atau mengupgrade instance MySQL yang ada ke versi tersebut, akan menghapus batasan ini pada tampilan sepenuhnya.

Namun, jika Anda memiliki versi produksi MySQL saat ini yang lebih lama dari v5.7.7, maka penghapusan batasan pada tampilan ini hanya menjadi salah satu kriteria yang dinilai saat membuat keputusan untuk meningkatkan atau tidak. Menggunakan teknik pemecahan masalah yang dijelaskan dalam jawaban lain mungkin merupakan solusi yang lebih layak - setidaknya dalam jangka pendek.


0

Menurut saya, MySQL 3.6 memberikan kesalahan berikut sedangkan MySQL 3.7 tidak lagi error. Saya belum menemukan apa pun di dokumentasi terkait perbaikan ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.