resolvi a consulta sem usar o NOT EXISTS como proposto, utilizei dois JOIN e WHERE.
resolvi a consulta sem usar o NOT EXISTS como proposto, utilizei dois JOIN e WHERE.
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.