Subquery ou JOINS? Vocês utilizam? Quando?

03/09/2018

0

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?
Pablo Carvalho

Pablo Carvalho

Responder

Post mais votado

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,

Alex Lekao

Alex Lekao
Responder

Mais Posts

03/09/2018

Luiz Santos

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
Responder

03/09/2018

Caio Rolla

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.
Responder

04/09/2018

Aylan Boscarino

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.
Responder

04/09/2018

Estevão Dias

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?
Responder

05/09/2018

Daniel Araújo

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.
Responder

05/09/2018

Estevão Dias

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.
Responder

10/09/2018

Aylan Boscarino

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?
Responder

10/09/2018

Caio Rolla

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.
Responder

11/09/2018

Estevão Dias

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.
Responder

12/09/2018

Aylan Boscarino

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?
Responder

17/09/2018

Jorge Vaz

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.
Responder

17/09/2018

Luiz Santos

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
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar