뷰의 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의 SELECT에 FROM 절에 하위 쿼리가 포함되어 있습니다."오류가 표시됩니다. 문제 및 가능한 해결책은 무엇입니까?

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.1- 참조 jira.mariadb.org/browse/MDEV-3944
ADARSH Madrecha에게

답변:


157

문서에 따라 :

MySQL 문서

  • SELECT 문은 FROM 절에 하위 쿼리를 포함 할 수 없습니다.

해결 방법은 각 하위 쿼리에 대한보기를 만드는 것입니다.

그런 다음보기 내에서 해당보기에 액세스합니다. view_credit_status


17
중첩 뷰는 심각한 성능 저하를 초래할 수 있습니다.
miguelcobain 2013 년

1
@miguelcobain, 단지 그것을 중첩시키기 위해 새로운 뷰를 생성하는 것은 당신이 말하는 "심각한 성능 페널티"를 제거하지 않습니다. 그래서 무엇을 제공합니까?
Pacerier

28
이제 5.7에서 허용됩니다! :-)
François Breton

4
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

보기 제한에 대한 최신 MySQL 문서에 따르면 다음과 같습니다.

MySQL 5.7.7 이전에는 뷰의 FROM 절에서 하위 쿼리를 사용할 수 없습니다.

즉, MySQL v5.7.7 이상을 선택하거나 기존 MySQL 인스턴스를 이러한 버전으로 업그레이드하면 뷰에 대한 이러한 제한이 완전히 제거됩니다.

그러나 v5.7.7 이전의 현재 프로덕션 MySQL 버전이있는 경우 뷰에 대한이 제한 제거는 업그레이드 여부를 결정하는 동안 평가되는 기준 중 하나 일뿐입니다. 다른 답변에 설명 된 해결 방법을 사용하는 것이 적어도 짧은 실행에서는 더 실용적인 솔루션이 될 수 있습니다.


0

MySQL 3.6은 다음 오류를 제공하는 반면 MySQL 3.7은 더 이상 오류가 발생하지 않는 것으로 보입니다. 이 수정에 관한 문서에서 아직 아무것도 찾지 못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.