Subquery ou JOINS? Vocês utilizam? Quando?
Fala pessoal!
Como vocês fazem quando querem fazer uma consulta mais complexa, que exija talvez a seleção em duas ou mais tabelas?
Hoje a gente sabe que pode utilizar tanto JOINS quanto subqueries, mas sempre tem aquela dúvida de qual deles utilizar. Será que preciso mesmo fazer uma junção entre as minhas tabelas ou posso resolver essa query apenas usando subquery? Deixando de certo modo a consulta mais estruturada?
Como vocês fazem quando querem fazer uma consulta mais complexa, que exija talvez a seleção em duas ou mais tabelas?
Hoje a gente sabe que pode utilizar tanto JOINS quanto subqueries, mas sempre tem aquela dúvida de qual deles utilizar. Será que preciso mesmo fazer uma junção entre as minhas tabelas ou posso resolver essa query apenas usando subquery? Deixando de certo modo a consulta mais estruturada?
Pablo Carvalho
Curtidas 0
Melhor post
Alex Lekao
03/09/2018
Ola Padro, boa tarde!!!
Eu utilizo de forma mista, vejo o que eu preciso especificamente, em alguns casos a subquery acaba sendo a melhor pedida, como por exemplo o ultimo registro de data de uma compra de um cliente que não tenha nf por exemplo, sei que ficou meio confuso, mas foi apenas um exemplo que as vezes vc não consegue fazer essa parametrização no join.
Eu tenho usado Outer Apply para fazer a substituição das duas situações, por se tornar em varias ocasiões mais performático que os dois, e vc acaba com um select que faz as duas situações de uma unica vez.
Mas o que precisa ser considerado sempre, eh o desempenho de um e de outro.
Espero ter ajudado.
Atenciosamente,
Eu utilizo de forma mista, vejo o que eu preciso especificamente, em alguns casos a subquery acaba sendo a melhor pedida, como por exemplo o ultimo registro de data de uma compra de um cliente que não tenha nf por exemplo, sei que ficou meio confuso, mas foi apenas um exemplo que as vezes vc não consegue fazer essa parametrização no join.
Eu tenho usado Outer Apply para fazer a substituição das duas situações, por se tornar em varias ocasiões mais performático que os dois, e vc acaba com um select que faz as duas situações de uma unica vez.
Mas o que precisa ser considerado sempre, eh o desempenho de um e de outro.
Espero ter ajudado.
Atenciosamente,
GOSTEI 3
Mais Respostas
Luiz Santos
03/09/2018
Boa tarde Pablo.
Cada caso é um caso.
A pergunta que você precisa fazer e, preciso retornar colunas de mais de uma tabela?
Se a resposta for sim, ai precisa usar o JOIN.
Se precisar da segunda query apenas com um filtro para a primeira, ai usa o EXISTS.
Espero ter ajudado.
Grande abraço..
Luiz Fernando
Cada caso é um caso.
A pergunta que você precisa fazer e, preciso retornar colunas de mais de uma tabela?
Se a resposta for sim, ai precisa usar o JOIN.
Se precisar da segunda query apenas com um filtro para a primeira, ai usa o EXISTS.
Espero ter ajudado.
Grande abraço..
Luiz Fernando
GOSTEI 2
Caio Rolla
03/09/2018
Depende muito, mas costumo utilizar subqueries sempre na clausula Where para excluir registros que batam com algum critério mais complexo... Acredito que fica mais legível. Quando pretendo associar registros, costumo utilizar JOIN.
GOSTEI 0
Aylan Boscarino
03/09/2018
Eu uso as duas formas, muitas das vezes o JOIN é o jeito mais performático porém eu prefiro usar subqueries em queries muito complexas por ficar mais claro o que está sendo feito.
GOSTEI 0
Estevão Dias
03/09/2018
Saquei Luiz, muito maneira essa contribuição (Y)
Tem também aquele cenário no qual você precisa pegar uma coluna de outra tabela e essa coluna deve ser gerada dinamicamente, com AVG, SUM, etc...
Nesse casos não dá pra gente gerar com JOIN, né? Daí algumas pessoas costumam fazer processamento no backend, passando os dados por um loop, como for e tal, pra calcular totais, médias, enfim
Você também opta por resolver dessa forma? Sem subquery, no backend?
Tem também aquele cenário no qual você precisa pegar uma coluna de outra tabela e essa coluna deve ser gerada dinamicamente, com AVG, SUM, etc...
Nesse casos não dá pra gente gerar com JOIN, né? Daí algumas pessoas costumam fazer processamento no backend, passando os dados por um loop, como for e tal, pra calcular totais, médias, enfim
Você também opta por resolver dessa forma? Sem subquery, no backend?
GOSTEI 2
Daniel Araújo
03/09/2018
Depende muito da situação. Uso muito subquerys nos filtros da consulta. Para montar uma coluna de forma dinâmica, eu faço a consulta com joins + funções de agregação e com subquery, e vejo qual tem a melhor performance. Sei que as vezes não temos muita opção, só funciona de uma forma. Mas esses casos são exceções. Na maioria dos casos que eu pego dá pra se trabalhar das duas maneiras.
GOSTEI 2
Estevão Dias
03/09/2018
Legal Daniel, vlw aí pela resposta!
Você tem encontrado muita diferença no plano de execução entre join ou subquery?
A comunidade costuma dizer que a diferença é imperceptível e eu mesmo nunca vi uma aplicação parar por conta disso, a não ser que a query tenha algum erro.
Você tem encontrado muita diferença no plano de execução entre join ou subquery?
A comunidade costuma dizer que a diferença é imperceptível e eu mesmo nunca vi uma aplicação parar por conta disso, a não ser que a query tenha algum erro.
GOSTEI 0
Aylan Boscarino
03/09/2018
Eu entendi que cada um tem seu caso em situações específicas, mas nas situações em que ambos são aptos de realizar a tarefa qual tem melhor performance? JOIN ou Subquery?
GOSTEI 0
Caio Rolla
03/09/2018
Acho que o desempenho deve ser o mesmo. O impacto da modelagem do banco no tempo de execução vai ser muito maior que a forma como uma query é escrita.
GOSTEI 0
Estevão Dias
03/09/2018
Tem isso e os erros comuns também, por exemplo a geração de produto cartesiano, que a gente explicou no curso, deixa de criar um filtro do tipo Where TabelaA.id = TabelaB.id_tabela_a, isso também é um grande gerador de gargalos.
GOSTEI 0
Aylan Boscarino
03/09/2018
Muito interessante mesmo esse assunto, é surpreendente como ele é pouco abordado na comunidade.
Uma dúvida que me acabou de surgir, existe algum limite para a recursividade de subquerys dentro de outras subquerys?
Uma dúvida que me acabou de surgir, existe algum limite para a recursividade de subquerys dentro de outras subquerys?
GOSTEI 0
Jorge Vaz
03/09/2018
Eu costumo utilizar o recurso da Cláusula WITH, que gera uma espécie de temporária, possibilitando o reuso de blocos de subquery que podem ser desdobradas em diversas referências para situações complexas. Gostaria apenas de frisar um sinônimo para essa utilização que são as "inline views" que na verdade são as próprias subquery.
GOSTEI 0
Luiz Santos
03/09/2018
Então Estevão.
Depende da complexidade do que você quer.
Do banco de dados que está usando.
Por exemplo, em SQL Server, você acabaria tendo que usar uma tabela temporária.
No Oracle um cursor.
Talvez até uma procedure.
É complicado dar uma única resposta que sirva para qualquer cenário.
Grande abraço
Luiz Fernando
Depende da complexidade do que você quer.
Do banco de dados que está usando.
Por exemplo, em SQL Server, você acabaria tendo que usar uma tabela temporária.
No Oracle um cursor.
Talvez até uma procedure.
É complicado dar uma única resposta que sirva para qualquer cenário.
Grande abraço
Luiz Fernando
GOSTEI 1