Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

O filtro de 2015 está errado.

Se o cliente Fábio não fez nenhuma compra de todo, logicamente ele também não fez compras em 2015. Por consequência a consulta deveria trazer o Fábio.

Nesta consulta que fiz, são geradas 56 linhas. 15 clientes * 4 anos =60 linhas. Ou seja, faltam 4, justamente do Fábio.

SELECT DISTINCT TC.CPF, NOME, YEAR(DATA_VENDA), NF.CPF FROM notas_fiscais NF LEFT JOIN tabela_de_clientes TC ON TC.CPF = NF.CPF ORDER BY NOME, YEAR(DATA_VENDA)``

Então fica a pergunta: é possível fazer a consulta desejada usando o LEFT JOIN?

Tô editando este comentário, porque até vi respostas aqui no fórum. Mas ainda fiquei na dúvida, pois a consulta de qualquer modo não traria qualquer registro, pois o Fábio não fez nenhuma compra em nenhum ano, e todos os outros fizeram compras em todos os anos. Os dados do banco não ajudam. Seria preciso que houvesse pelo menos uma pessoa sem compras em 2015 mas com compras em outro ano.

4 respostas

Bruno. Esta consulta está partindo das notas_fiscais, a keyword LEFT JOIN irá filtrar todos os registros da tabela à esquerda, no caso notas_fiscais, idependente se elas possuem o CPF registrado, na tabela tabela_de_clientes.

Se deseja o comportamento que mencionou, inverta a ordem das tabelas ou troque o comando para RIGHT JOIN.

Olá Bruno, tudo bem? É isso mesmo que o Euler falou! Você entendeu direitinho? Ou ainda tem alguma dúvida? Se tiver é só falar aqui, estamos a disposição!

Olá, pessoal! Não fui muito claro na minha exposição.

O instrutor fez uma consulta, em que ele traz todo o mundo que aparece na tabela da esquerda e não aparece na tabela da direita. Retorna um resultado, o Fábio.

SELECT DISTINCT A.CPF, A.NOME, B.CPF FROM tabela_de_clientes A LEFT JOIN notas_fiscais B ON A.CPF = B.CPF WHERE B.CPF IS NULL;

Em seguida ele acrescenta um critério, que é o ano.

SELECT DISTINCT A.CPF, A.NOME, B.CPF FROM tabela_de_clientes A LEFT JOIN notas_fiscais B ON A.CPF = B.CPF WHERE B.CPF IS NULL AND YEAR(B.DATA_VENDA) = 2015;

E aí não retorna nenhum resultado!

Se o Fábio não aparece de todo na tabela da esquerda, ele não aparecerá vinculado nem ao ano de 2015, nem ao de 2016 etc. Ou seja, a segunda consulta deveria retornar o mesmo Fábio.

Agora entendi Bruno, bem isso acontece porque as condições do WHERE não foram satisfeitas, note que o professor se equivocou nisso, porque ele quer buscar qual o CPF da tabela de clientes "não" está na tabela de notas fiscais (B.CPF IS NULL), e nesse caso é o Fábio, porém depois ele tenta a consulta com o AND YEAR(B.DATA_VENDA) = 2015, e nenhum resultado é retorna, e isso aconteceu porque o CPF do Fábio "não" está na tabela de notas fiscais então não tem como ter um registro um registro no CPF de Fábio na tabela de notas fiscais do ano de 2015. E como ele usou a condição AND no WHERE então, ambas as condições precisam ser verdadeiras para que o resultado seja verdadeiro, assim, a segunda condição YEAR(B.DATA_VENDA) = 2015 é falsa em relação a primeira, o fato é que nessa consulta nenhum registro vai atender as duas condições do WHERE.

Foi isso, espero ter esclarecido sua dúvida!