4
respostas

LEFT JOIN

Boa noite,

Criei a seguinte query:

SELECT A.NOME_DO_PRODUTO, A.CODIGO_DO_PRODUTO, COUNT(*) AS TOTAL_VENDA FROM tabela_de_produtos A
LEFT JOIN ITENS_NOTAS_FISCAIS B
ON A.CODIGO_DO_PRODUTO = B.CODIGO_DO_PRODUTO
GROUP BY A.NOME_DO_PRODUTO, A.CODIGO_DO_PRODUTO;

E observei que o produto 838819 só tem uma venda e nao encontrei ele na tabela de ITENS_NOTAS FISCAIS.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Então, criei a query abaixo para o produto 838819 vir como null

SELECT DISTINCT A.CODIGO_DO_PRODUTO AS CODIGO_DO_PRODUTO, B.CODIGO_DO_PRODUTO AS CODIGO_NOTA
FROM tabela_de_produtos A LEFT JOIN ITENS_NOTAS_FISCAIS B
ON A.CODIGO_DO_PRODUTO = B.CODIGO_DO_PRODUTO;

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A minha dúvida é onde eu errei na primeira query pra trazer o produto 838819 com total de venda = 1, sendo que ele não está na tabela de ITENS_NOTAS_FISCAIS ?

4 respostas

Oii Gabriel, tudo bem?

Bom, o erro se encontra na forma em que você colocou as tabelas no JOIN.

Como o LEFT JOIN busca os dados existentes da tabela esquerda e no seu código a tabela esquerda é a de produtos:

SELECT A.NOME_DO_PRODUTO, A.CODIGO_DO_PRODUTO, COUNT(*) AS TOTAL_VENDA 
FROM tabela_de_produtos A

LEFT JOIN ITENS_NOTAS_FISCAIS B ON A.CODIGO_DO_PRODUTO = B.CODIGO_DO_PRODUTO

GROUP BY A.NOME_DO_PRODUTO, A.CODIGO_DO_PRODUTO;

Então ele vai trazer a contagem de todos os produtos, entretanto não deveria ter trazido como '1' e sim como NULL.

Ao trocar o lugar das tabelas no JOIN, o resultado vem corretamente:


SELECT A.NOME_DO_PRODUTO, A.CODIGO_DO_PRODUTO, COUNT(*) AS TOTAL_VENDA 
FROM ITENS_NOTAS_FISCAIS B

LEFT JOIN tabela_de_produtos A ON A.CODIGO_DO_PRODUTO = B.CODIGO_DO_PRODUTO

GROUP BY A.NOME_DO_PRODUTO, A.CODIGO_DO_PRODUTO;

Isso porque a tabela da esquerda é a de itens notas fiscais, então irá trazer a contagem dos produtos que estão nessa tabela.

Espero que eu tenha conseguido explicar o que aconteceu. Qualquer coisa é só falar, beleza? :)

Maria, uma dúvida. Eu executei o comando que me enviou, mas o item 838819 não foi retornado. Não teria que vir como null ?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Maria, fiz um full join pra ver o que retornava e retornou valor de 1. Não sei onde vem esse valor se não existe na tabela de ITENS_NOTAS_FISCAIS. Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Oi Gabriel,

Maria, uma dúvida. Eu executei o comando que me enviou, mas o item 838819 não foi retornado. Não teria que vir como null ?

Não, ele não teria que vir, pois não existe vendas dele na tabela de itens_notas_fiscais. Como expliquei acima, o LEFT JOIN busca os valores se existente na tabela da esquerda, como itens_notas_fiscais está na esquerda, traz apenas a contagem dos produtos que existem nessa tabela.

Maria, fiz um full join pra ver o que retornava e retornou valor de 1. Não sei onde vem esse valor se não existe na tabela de ITENS_NOTAS_FISCAIS.

O FULL JOIN ele traz tudo de ambas tabelas, mesmo que não exista em itens_notas_fiscais. Como é um COUNT, ele retorna como 1 em vez de NULL.

Qualquer dúvidas estou à disposição :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software