O SELECT da view contém uma subconsulta na cláusula FROM

111

Tenho duas tabelas e preciso criar um modo de exibição. As tabelas são:

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

Eu uso a seguinte consulta para fazer isso. A consulta sem a parte "criar visão" funciona bem, mas com "criar visão", ela mostra o erro "SELECT da visão contém uma subconsulta na cláusula FROM". Qual poderia ser o problema e a possível solução:

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)
Raouf Athar
fonte
@MattFenwick, não, não é - essa consulta pode ser reescrita facilmente, o que não é possível em geral
TMS
As subconsultas são suportadas no mariadb a 10.2partir da versão 10.2.1See - jira.mariadb.org/browse/MDEV-3944
Adarsh ​​Madrecha

Respostas:

157

Conforme documentação:

Documentos MySQL

  • A instrução SELECT não pode conter uma subconsulta na cláusula FROM.

Sua solução alternativa seria criar uma visualização para cada uma de suas subconsultas.

Em seguida, acesse essas visualizações de dentro de sua visualização view_credit_status

Nonym
fonte
17
Observe que o aninhamento de visualizações pode causar sérias penalidades de desempenho.
miguelcobain
1
@miguelcobain, Criar uma nova visualização apenas para aninhá-la não remove as "graves penalidades de desempenho" de que você está falando. Então, o que dá?
Pacerier
28
Agora permitido em 5.7! :-)
François Breton
4
Também não permitido no MariaDB
Pedro
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)
Michał Powaga
fonte
13

Como a documentação mais recente do MySQL sobre restrições de visualização diz:

Antes do MySQL 5.7.7, subconsultas não podem ser usadas na cláusula FROM de uma visão.

Isso significa que escolher um MySQL v5.7.7 ou mais recente ou atualizar a instância existente do MySQL para essa versão removeria completamente essa restrição nas visualizações.

No entanto, se você tiver uma versão de produção atual do MySQL anterior à v5.7.7, a remoção dessa restrição nas visualizações deve ser apenas um dos critérios avaliados durante a decisão de atualizar ou não. Usar as técnicas alternativas descritas nas outras respostas pode ser uma solução mais viável - pelo menos a curto prazo.

Sombra
fonte
0

Parece que o MySQL 3.6 apresenta o seguinte erro, enquanto o MySQL 3.7 não apresenta mais erros. Ainda não encontrei nada na documentação sobre essa correção.

user3809638
fonte