3
respostas

DUVIDA SOBRE O LEFT JOIN

No exemplo da aula, ele usa o left join para achar um cliente que não fez nenhuma compra, que não tem nenhuma nota fiscal no seu CPF, e o resultado é uma lista com todos que fizeram compras, mais esse cliente que pela explicação deveria estar com valor NULL, mas está com valor 1. Ok, mas e se tivessem outros clientes que fizeram somente 1 compra. Como eu iria saber que fez 1 compra e quem não fez nenhuma?

3 respostas

Olá Isabella,

Quando se faz LEFT JOIN, os campo da tabela do join que não tiverem match (e aqui imagimo que você deve estar fazendo join entre uma tabela clientes e uma tebal de nota fiscal) irão aparecer como NULL na tabela de nota fiscal. Suponhamos que tabela nota fiscal você traz o campo NUMERO_NF, nesse caso é só usar a condição NUMERO_NF IS NULL dentro do seu WHERE, assim só irá aparecer os clientes que não possuem nenhuma NF no CPF.

Abs

Sim. Mas no exemplo dado, e quando rodamos os comandos que baixamos, ele aparece 1, e não NULL. Mesmo no video da lição aparece como 1, quando o profe roda o comando. Da uma olhada la. Ele comenta: era para aparecer Null, mas ta aparecendo 1, que é a mesma coisa. Ai eu pensei, e se tiver gente com só uma compra. Ele fala exatamente assim: como eu estou usando o group by, na hora de fazer o count, ele conta isso como uma ocorrencia. Minuto 8:09 do video Usando LEFT e RIGHT JOIN, do SQL server consultas avançadas.

[07:31] E vai aparecer um NULL lá na minha linha. Vamos ver aqui, vou agora usar o LEFT JOIN. Note que, ao olhar aqui, eu vou ter esse Fábio Carvalho com COUNT igual a 1, mas eu vou explicar o porquê.

[07:54] Porque, como eu usei o GROUP BY, ele tem uma linha assim de dados, que é o nome do cliente e do lado o NULL. Mas na hora de fazer o COUNT, esse cara conta como uma ocorrência.

[08:09] Mas o que significa o seguinte, esse Fábio Carvalho, ele é o cara, ele é um cliente que não fez nenhuma venda.

è algum erro, ou é assim mesmo? o que eu quero saber é: se for uma tabela com milhares de clientes, e eu quero saber quem tem zero, uma ou duas compras somente. O zero deveria ser Null, certo?

Ahhhh, eu não fiz o curso, mas o COUNT deve retornar 1 mesmo, até porque ele deve estar com GROUP BY no nível de CPF.

Se você quiser apenas os que não tem nenhuma compra, é só tirar o count e o group by, seria algo na linha do que vou colocar abaixo:

SELECT 
    [TABELA DE CLIENTES].[CPF], 
    [TABELA DE CLIENTES].[NOME]
FROM [TABELA DE CLIENTES] 
LEFT JOIN [NOTAS FISCAIS] ON [TABELA DE CLIENTES].CPF = [NOTAS FISCAIS].CPF
WHERE [NOTAS FISCAIS].CPF IS NULL

Nesse caso, ele vai retornar apenas a lista dos que não fizeram nenhuma compra, se você quiser quantidade 0 para nenhuma compra também é possível, mas é provável que você terá que usar conceitos que só vai aprender mais na frente do curso:

SELECT 
    [TABELA DE CLIENTES].[CPF], 
    [TABELA DE CLIENTES].[NOME],
    SUM(CASE WHEN [NOTAS FISCAIS].CPF IS NULL THEN 0 ELSE 1 END) as QTD_NOTAS
FROM [TABELA DE CLIENTES] 
LEFT JOIN [NOTAS FISCAIS] ON [TABELA DE CLIENTES].CPF = [NOTAS FISCAIS].CPF
GROUP BY  [TABELA DE CLIENTES].[CPF], [TABELA DE CLIENTES].[NOME]

Nesse caso a função CASE vai dar o valor de 0 para cada linha que não tem CPF em notas fiscais 1 para quanto tem, depois vai somar isso, de forma que vai trazer 0 para quando um cliente não tiver nenhum CPF.

Abs!