Welcome to Our Website

SQL Tip: Left JOINs and WHERE clauses … are they really LEFT JOINs?

X

Privacidade & Cookies

Este site utiliza cookies. Continuando, você concorda com o uso deles. Saiba mais, incluindo como controlar cookies.consegui!,

Anúncios

Há vezes quando faço a revisão de consultas SQL e encontrar pessoas usando LEFT OUTER JOINs, mas, em seguida, use cláusulas WHERE, que transformam as associações em Associações INTERNAS. Recentemente como eu mencionei isso para alguém que me lembrou que eu deveria blogar sobre it…so aqui estou eu blogando sobre isso. 🙂

Em primeiro lugar, se você não está familiarizado com as diferentes junções vá em frente e leia esta outra dica SQL que eu escrevi., Agora, vamos começar a aprender um pouco mais sobre a junção exterior esquerda (eu vou se referir a ela simplesmente como a junção esquerda a partir daqui para fora).vamos começar com alguns dados de amostra. O seguinte pode ser usado no início de suas próprias consultas se você vai executar estes testes para si mesmo. Como você pode ver, ele cria duas tabelas (variáveis de tabela).,

Se quisermos retornar todos os registos em “Tabela1” independentemente de haver ou não um registro associado na “Tabela2” e mostrar os dados do “Tabela2” quando há um registro associado iríamos escrever um LEFT JOIN, assim:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID;

Saída:

no Entanto, se deseja adicionar uma cláusula WHERE na consulta para obter apenas os dados do “Tabela2”, onde a IDENTIFICAÇÃO é menor do que 4, podemos fazer algo parecido com isso:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID < 4;

Saída:

Mas…você fez ver que só temos os valores em que há uma correspondência de ID em ambas as tabelas?, Isso parece ser muito parecido com uma união interior, certo? Isso é porque é. Não acreditas em mim? Dê uma olhada no plano de execução depois de executar a junção esquerda com e sem a condição de onde. Aqui está o que você vai ver:

então como podemos contornar isso? Bem, já que você está fazendo uma junção à esquerda para começar com você obviamente precisa ou quer devolver todos os registros de “Table1”, independentemente dos dados em “Table2”., E se você realmente não quiser retornar dados para certos registros em “Table2”, então você pode filtrar esses registros em seu predicado de adesão (o ‘critério de busca’ na parte da junção). Por exemplo, a última consulta seria escrita assim:

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID AND tb2.columnID < 4;

saída:

ver como ainda conseguimos os 5 registros de “Table1”, mas não os dados de “Table2” que não cumprem os nossos critérios? Apenas devolve NULLs para os dados naquela tabela que não cumprem os critérios. É fantástico, não é?,

E … podemos olhar para o plano de execução novamente para provar que estamos realmente a usar uma junção à esquerda:

E quando em vez de um valor alguém usa a condição é nula em vez disso? Nesse caso, podes usar isso na cláusula onde.

SELECT * FROM @Table1 tb1 LEFT OUTER JOIN @Table2 tb2 ON tb1.colID = tb2.columnID WHERE tb2.columnID IS NULL;

Saída:

E, vamos olhar para o plano de execução novamente:

Notice it performs the left join and then filters for the NULL records? É o que queremos que faça e, francamente, é o que provavelmente esperávamos que fizesse.

E se usarmos não é nulo em vez disso? Bem … isso é outra história., Vou estragar a surpresa e dizer-te que vai fazer uma junção interior, tal como faria com um valor real. Se não acredita em mim, faça você mesmo a consulta e veja o plano de execução.

assim, aí você tem; é assim que uma junção à esquerda pode ou não ser uma junção à esquerda. Esperemos que esta informação o ajude a escrever melhor, ou pelo menos, consultas mais informadas.

Anúncios

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *