Görünümün SELECT, FROM yan tümcesinde bir alt sorgu içeriyor


111

İki tablom var ve bir görünüm oluşturmam gerekiyor. Tablolar:

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

Bunu yapmak için aşağıdaki sorguyu kullanıyorum. "Görünüm oluşturma" bölümü olmayan sorgu iyi çalışıyor ancak "görünüm oluştur" ile "Görünümün SELECT, FROM yan tümcesinde bir alt sorgu içeriyor" hatasını gösteriyor. Sorun ve olası çözüm ne olabilir:

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, hayır değil - bu sorgu kolayca yeniden yazılabilir, bu genel olarak mümkün değildir
TMS

Alt sorgular mariadb desteklenen 10.2sürümü dan 10.2.1- Bkz jira.mariadb.org/browse/MDEV-3944
Adarsh Madrecha

Yanıtlar:


157

Belgelere göre:

MySQL Belgeleri

  • SELECT deyimi, FROM yan tümcesinde bir alt sorgu içeremez.

Çözümünüz, alt sorgularınızın her biri için bir görünüm oluşturmak olacaktır.

Ardından bu görünümlere kendi görünümünüzden erişin view_credit_status


17
İç içe yerleştirme görünümlerinin ciddi performans cezalarına neden olabileceğini unutmayın.
miguelcobain

1
@miguelcobain, Sırf iç içe yerleştirmek için yeni bir görünüm oluşturmak, bahsettiğiniz "ciddi performans cezalarını" ortadan kaldırmaz. Peki ne verir?
Pacerier

28
Şimdi 5.7'de izin veriliyor! :-)
François Breton

4
MariaDB'de de izin verilmez
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

Görünüm kısıtlamalarıyla ilgili daha yeni MySQL belgelerinin dediği gibi:

MySQL 5.7.7'den önce, alt sorgular bir görünümün FROM yan tümcesinde kullanılamaz.

Bu, MySQL v5.7.7 veya daha yenisini seçmenin veya mevcut MySQL örneğini böyle bir sürüme yükseltmenin görünümlerdeki bu kısıtlamayı tamamen kaldıracağı anlamına gelir.

Bununla birlikte, v5.7.7'den daha eski bir mevcut üretim MySQL sürümünüz varsa, bu durumda görünümlerdeki bu kısıtlamanın kaldırılması, yükseltme veya yükseltmeme kararı verirken değerlendirilen kriterlerden yalnızca biri olmalıdır. Diğer cevaplarda açıklanan geçici çözüm tekniklerini kullanmak daha uygun bir çözüm olabilir - en azından kısa vadede.


0

MySQL 3.6 artık hata vermezken MySQL 3.6 aşağıdaki hatayı veriyor gibi görünüyor. Bu düzeltmeyle ilgili belgelerde henüz bir şey bulamadım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.