1
resposta

[Sugestão] A solução sugerida não deveria usar JOIN

A lição é sobre subconsulta, mas foi usado JOIN.

O Leonardo Rocha trouxe uma solução usando WHERE mais eficiente. Trago aqui uma outra solução usando WHERE EXISTS:

SELECT 
    Nome,
    (SELECT TabelaEmprestimo.Valor
     FROM TabelaEmprestimo
     WHERE TabelaEmprestimo.id_cliente = TabelaClientes.id_cliente
     AND TabelaEmprestimo.Valor > (SELECT AVG(Valor) FROM TabelaEmprestimo)
     LIMIT 1) AS Valor
FROM TabelaClientes
WHERE EXISTS (
    SELECT 1
    FROM TabelaEmprestimo
    WHERE TabelaEmprestimo.id_cliente = TabelaClientes.id_cliente
    AND TabelaEmprestimo.Valor > (SELECT AVG(Valor) FROM TabelaEmprestimo)
);
1 resposta

Oi, Rubens! Como vai?

Ótima observação! A consulta original da atividade usa JOIN para trazer os clientes com empréstimos acima da média:


SELECT 
    Nome,
    Valor
FROM TabelaClientes
JOIN TabelaEmprestimo ON TabelaClientes.id_cliente = TabelaEmprestimo.id_cliente
WHERE Valor > (SELECT AVG(Valor) FROM TabelaEmprestimo);

A sua sugestão utilizando WHERE EXISTS é uma abordagem interessante, pois evita o retorno de valores duplicados quando há múltiplos empréstimos por cliente e pode melhorar a performance em certos bancos de dados.

Veja a diferença entre as abordagens:


-- Usando JOIN (consulta original da atividade)
SELECT 
    Nome,
    Valor
FROM TabelaClientes c
JOIN TabelaEmprestimo e ON c.id_cliente = e.id_cliente
WHERE e.Valor > (SELECT AVG(Valor) FROM TabelaEmprestimo);

-- Usando WHERE EXISTS (sua sugestão)
SELECT Nome
FROM TabelaClientes c
WHERE EXISTS (
    SELECT 1
    FROM TabelaEmprestimo e
    WHERE e.id_cliente = c.id_cliente
    AND e.Valor > (SELECT AVG(Valor) FROM TabelaEmprestimo)
);

A principal diferença entre elas é que:

  • A versão com JOIN retorna o nome do cliente e o valor do empréstimo que está acima da média.
  • A versão com WHERE EXISTS apenas verifica se o cliente possui ao menos um empréstimo acima da média, retornando somente os nomes.

Caso o objetivo seja listar os valores dos empréstimos acima da média, o uso de JOIN faz mais sentido.Por outro lado, se o foco for apenas verificar quais clientes possuem ao menos um empréstimo acima da média, WHERE EXISTS é uma alternativa mais enxuta.

Parabéns pela iniciativa de pensar em uma solução alternativa e compartilhar com os outros estudantes! Explorar diferentes abordagens é uma ótima maneira de aprofundar seu conhecimento em SQL.

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado