2
respostas

alternativa

resolvi a consulta sem usar o NOT EXISTS como proposto, utilizei dois JOIN e WHERE.

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

2 respostas

Oi, Lucas!

Obrigado por compartilhar suas reflexões e aprendizados com a comunidade Alura.

Sua abordagem faz sentido e mostra um bom domínio das consultas SQL. Usar JOINs e WHERE pode ser uma alternativa válida dependendo do contexto e da estrutura do banco de dados.

Seguir explorando diferentes formas de resolver um problema é um ótimo caminho para aprofundar o aprendizado.

Mas reforço o NOT EXISTS é útil para verificar a ausência de registros de forma eficiente. Se quiser testar, tente reescrever sua consulta com ele e compare os resultados e a performance.

Conte com o apoio do Fórum na sua jornada. Abraços e bons estudos!

Espero ter ajudado! Bons estudos!

Sucesso

Olá! Eu tenho uma dúvida. Ao testar a sugestão de resposta fornecida pelo instrutor, percebi o seguinte comportamento ao utilizar o comando NOT EXISTS:

SELECT 
    Nome, 
    Email, 
    Valor
FROM TabelaClientes
JOIN TabelaEmprestimo ON TabelaClientes.id_cliente = TabelaEmprestimo.id_cliente
WHERE NOT EXISTS (
    SELECT 1 
    FROM TabelaPagamentos 
    WHERE TabelaPagamentos.id_emprestimo = TabelaEmprestimo.id_emprestimo AND Status != 'Pago'
);

O comando retornou um cliente que não está registrado na tabela TabelaPagamentos, ou seja, esse cliente está presente apenas nas tabelas TabelaClientes e TabelaEmprestimo, mas não existe nenhum pagamento associado a ele. Gostaria de entender o motivo de isso ter ocorrido, e se esse comportamento é esperado ou correto, já que não há informações sobre o status de pagamento desse cliente (ele nem sequer tem registros na tabela TabelaPagamentos).

Observação: Eu mesma inseri um cliente adicional para realizar este teste.

Notei também que, ao remover o NOT do NOT EXISTS e alterar a condição para verificar a premissa como verdadeira (ou seja, ao utilizar o EXISTS), a consulta retorna o resultado esperado: apenas os clientes com pagamentos com status 'Pago'. A consulta resultante ficou assim:

SELECT Nome, Email, Valor
FROM Clientes
JOIN Emprestimo ON Clientes.id_cliente = Emprestimo.id_cliente
WHERE EXISTS (
    SELECT 1 
    FROM Pagamentos 
    WHERE Pagamentos.id_emprestimo = Emprestimo.id_emprestimo AND Status = 'Pago'
);

Gostaria de entender melhor por que a utilização do NOT EXISTS no cenário original trouxe um cliente que não estava registrado na tabela Pagamentos, enquanto a versão com EXISTS retorna apenas os clientes com o status 'Pago', conforme esperado.