Substituir SubQuery por Join

4 respostas Resolvido
R

Como posso substituir esta SubQuery por JOIN?

SELECT v._id, v.nome,
             (SELECT IFNULL(SUM(p.valor),0)
             FROM pedidos p
             WHERE p.id_vendedor = v._id
             AND p.data BETWEEN '2015-12-01' AND '2015-12-31')
             AS valor
             FROM vendedor v
             WHERE v.id_supervisor = 1

Tentei assim, mas não deu certo:

SELECT v._id, v.nome, IFNULL(SUM(p.valor),0)
 FROM
 vendedor v LEFT JOIN pedidos p ON p.id_vendedor = v._id
  WHERE p.data BETWEEN '2015-12-01' AND '2015-12-31'
  AND v.id_supervisor = 1

4 Respostas

M
Solucao aceita

Boa tarde, não testei mas acho que dará certo, tente assim:

SELECT v._id, v.nome, SUM(IFNULL(p.valor,0)) as valorPedidos FROM pedidos p INNER JOIN vendedor v ON (p.id_vendedor = v._id) WHERE p.data BETWEEN '2015-12-01' AND '2015-12-31' AND v.id_supervisor = 1 GROUP BY v._id, v.nome;

R

Deu certo cara, vlw
Na minha query faltou GROUP BY.

Qual a melhor maneira de se fazer? SubQuery ou Join?

M

Não sei te responder com toda a certeza, mas acredito que usando JOIN é a melhor opção. Fazer um select dentro de outro, na minha percepção, parece ser mais pesado. Que bom que deu certo, continue os estudos!

Joao_Miguel1

SELECT PR.NOME, COUNT(DISTINCT I.CODINSTIT) NINST, SUM(VALORTOAL) SOMA
FROM PRENDA PR, DOACAO D, PESSOA P, INSTITUICAO I
WHERE PR.CODPRENDA = D.CODPRENDA
AND D.CODPESSOA = P.CODPESSOA
AND D.CODINSTIT = I.CODINSTIT
AND C.CIDADE LIKE ‘COIMBRA’
AND SYSDATE - DATADOACAO > 0
AND DATADOACAO > DATANASCIMEN
AND TO_NUMBER(TO_CHAR(DATANASC,’YYYY’)) - TO_NUMBER(TO_CHAR(SYSDATE,’YYYY’))=18
AND VALORTOTAL * 1.23 > 3000
GROUP BY PR.NOME;

Como posso tornar esta pesquisa mais rápida para a sua execução?

Criado 27 de janeiro de 2016
Ultima resposta 16 de jun. de 2019
Respostas 4
Participantes 3