View's SELECT มีคิวรีย่อยในส่วนคำสั่ง FROM


111

ฉันมีสองตารางและฉันต้องการสร้างมุมมอง ตารางคือ:

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

ฉันใช้แบบสอบถามต่อไปนี้เพื่อทำสิ่งนี้ คำค้นหาที่ไม่มีส่วน "create view" ทำงานได้ดี แต่เมื่อใช้ "create view" จะแสดงข้อผิดพลาด "View's SELECT มีคิวรีย่อยใน FROM clause" ปัญหาและแนวทางแก้ไขที่เป็นไปได้คืออะไร:

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 ไม่มันไม่ได้ - แบบสอบถามนั้นสามารถเขียนใหม่ได้อย่างง่ายดายซึ่งไม่สามารถทำได้โดยทั่วไป
TMS

การสืบค้นย่อยได้รับการสนับสนุนใน mariadb 10.2จากเวอร์ชัน10.2.1See - jira.mariadb.org/browse/MDEV-3944
Adarsh ​​Madrecha

คำตอบ:


157

ตามเอกสาร:

เอกสาร MySQL

  • คำสั่ง SELECT ไม่สามารถมีเคียวรีย่อยในส่วนคำสั่ง FROM

วิธีแก้ปัญหาของคุณคือการสร้างมุมมองสำหรับแต่ละแบบสอบถามย่อยของคุณ

จากนั้นเข้าถึงมุมมองเหล่านั้นจากภายในมุมมองของคุณ view_credit_status


17
โปรดทราบว่ามุมมองที่ซ้อนกันอาจทำให้เกิดการลงโทษด้านประสิทธิภาพที่ร้ายแรง
miguelcobain

1
@miguelcobain การสร้างมุมมองใหม่เพียงเพื่อซ้อนมันไม่ได้ลบ "บทลงโทษด้านประสิทธิภาพที่ร้ายแรง" ที่คุณกำลังพูดถึง ให้อะไร?
Pacerier

28
อนุญาตแล้วใน 5.7! :-)
François Breton

4
ไม่อนุญาตใน MariaDB เช่นกัน
เตอร์

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

ตามที่เอกสาร MySQL ล่าสุดเกี่ยวกับข้อ จำกัด การดูกล่าวว่า:

ก่อน MySQL 5.7.7 ไม่สามารถใช้เคียวรีย่อยในส่วนคำสั่ง FROM ของมุมมองได้

ซึ่งหมายความว่าการเลือก MySQL v5.7.7 หรือใหม่กว่าหรือการอัปเกรดอินสแตนซ์ MySQL ที่มีอยู่เป็นเวอร์ชันดังกล่าวจะเป็นการลบข้อ จำกัด นี้ในมุมมองโดยสิ้นเชิง

อย่างไรก็ตามหากคุณมี MySQL เวอร์ชันที่ใช้งานจริงซึ่งเก่ากว่า v5.7.7 การลบข้อ จำกัด นี้ในมุมมองควรเป็นเพียงหนึ่งในเกณฑ์ที่ได้รับการประเมินในขณะที่ตัดสินใจว่าจะอัปเกรดหรือไม่ การใช้เทคนิควิธีแก้ปัญหาที่อธิบายไว้ในคำตอบอื่น ๆ อาจเป็นวิธีแก้ปัญหาที่มีประสิทธิภาพมากขึ้น - อย่างน้อยก็ในระยะสั้น


0

ดูเหมือนว่าฉันเป็น MySQL 3.6 ให้ข้อผิดพลาดต่อไปนี้ในขณะที่ MySQL 3.7 ไม่มีข้อผิดพลาดอีกต่อไป ฉันยังไม่พบสิ่งใดในเอกสารเกี่ยวกับการแก้ไขนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.