Subquery ou JOINS? Vocês utilizam? Quando?

SQL Server

SQL

Banco de Dados

03/09/2018

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

Curtidas 0

Melhor post

Alex Lekao

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,
GOSTEI 3

Mais Respostas

Luiz Santos

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
GOSTEI 2
Caio Rolla

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

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

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?
GOSTEI 2
Daniel Araújo

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

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.
GOSTEI 0
Aylan Boscarino

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

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

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

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?
GOSTEI 0
Jorge Vaz

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

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
GOSTEI 1
POSTAR