Conselhos de Toad for Oracle Formatter
Pergunta
O que a média aviso?
Por que é o segundo exemplo pior do que o primeiro?
SELECT product_id, prod.name name, sample_id
FROM lims.sample JOIN lims.product prod USING (product_id)
vs.
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample)
JOIN lims.product prod
/* ADVICE: [131] This item has not been declared, or it refers to a label */
USING (product_id)
/* ADVICE:
ADVICE SUMMARY
Count Recommendation
----- --------------
1 [131] This item has not been declared, or it refers to a label
The Oracle equivalent error messages are PLS-00320 and
PLS-0321.
*/
FYI: Ambas as consultas correr bem e retornar os mesmos resultados
.Solução
Pondo de lado quantidade de dados, índices e estatísticas recolhidas das mesas; em geral, não aninhado subqueries deve outperform aninhada subqueries .
Outras dicas
Meu palpite: Parece SAPO não é analisar a consulta da mesma forma que a Oracle iria
.Na primeira consulta, talvez cheques SAPO as definições de tabela para lims.sample e lims.product, e encontra a coluna "product_id" em ambos, por isso é bom.
Na segunda consulta, sapo não pode verificar a definição da tabela para a primeira parte da junção porque é uma consulta aninhada; talvez por isso desiste e dá-lhe este conselho (que é por isso que o conselho diz "... ou se refere a um rótulo", que é provavelmente uma copout).
Eu ignorar o conselho neste caso, especialmente no que funciona bem e retorna os mesmos resultados.
Apenas um palpite, mas na segunda consulta seu subconsulta não é chamado - tente dar-lhe um alias; por exemplo:
SELECT product_id, prod.name name, sample_id
FROM (SELECT sample_id, product_id FROM lims.sample) samp
JOIN lims.product prod
USING (product_id)