SELECT của dạng xem chứa một truy vấn con trong mệnh đề FROM


111

Tôi có hai bảng và tôi cần tạo một khung nhìn. Các bảng là:

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

Tôi sử dụng truy vấn sau để làm điều này. Truy vấn không có phần "tạo chế độ xem" hoạt động tốt nhưng với "tạo chế độ xem", nó hiển thị lỗi "CHỌN của chế độ xem chứa truy vấn con trong mệnh đề FROM". Vấn đề có thể là gì & giải pháp khả thi:

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, không, không phải - truy vấn đó có thể được viết lại một cách dễ dàng, điều này nói chung là không thể
TMS

Truy vấn phụ được hỗ trợ trong mariadb 10.2từ phiên bản 10.2.1See - jira.mariadb.org/browse/MDEV-3944
Adarsh ​​Madrecha

Câu trả lời:


157

Theo tài liệu:

Tài liệu MySQL

  • Câu lệnh SELECT không được chứa truy vấn con trong mệnh đề FROM.

Cách giải quyết của bạn là tạo chế độ xem cho từng truy vấn phụ của bạn.

Sau đó, truy cập các chế độ xem đó từ trong chế độ xem của bạn view_credit_status


17
Lưu ý rằng các chế độ xem lồng nhau có thể gây ra các hình phạt hiệu suất nghiêm trọng.
miguelcobain

1
@miguelcobain, Tạo một chế độ xem mới chỉ để lồng vào nó không loại bỏ "các hình phạt hiệu suất nghiêm trọng" mà bạn đang nói đến. Vì vậy, những gì cho?
Pacerier

28
Bây giờ được phép trong 5.7! :-)
François Breton

4
Cũng không được phép ở 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

Như tài liệu MySQL gần đây hơn về hạn chế chế độ xem cho biết:

Trước MySQL 5.7.7, không thể sử dụng truy vấn con trong mệnh đề FROM của một dạng xem.

Điều này có nghĩa là việc chọn MySQL v5.7.7 hoặc mới hơn hoặc nâng cấp phiên bản MySQL hiện có lên phiên bản như vậy, sẽ loại bỏ hoàn toàn hạn chế này đối với các chế độ xem.

Tuy nhiên, nếu bạn có phiên bản MySQL sản xuất hiện tại cũ hơn v5.7.7, thì việc loại bỏ hạn chế về số lượt xem này chỉ nên là một trong những tiêu chí được đánh giá khi đưa ra quyết định có nâng cấp hay không. Sử dụng các kỹ thuật giải quyết được mô tả trong các câu trả lời khác có thể là một giải pháp khả thi hơn - ít nhất là trong thời gian ngắn hơn.


0

Có vẻ như MySQL 3.6 đưa ra lỗi sau trong khi MySQL 3.7 không còn lỗi nữa. Tôi vẫn chưa tìm thấy bất cứ điều gì trong tài liệu về bản sửa lỗi này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.