[mysql] 뷰의 SELECT는 FROM 절에 하위 쿼리를 포함합니다.

두 개의 테이블이 있고 뷰를 만들어야합니다. 테이블은 다음과 같습니다.

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)



답변

문서에 따라 :

MySQL 문서

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

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

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


답변

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)


답변

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

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

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

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


답변

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


답변