[SQL SERVER] LEFT JOIN repetindo resultados

SQL Server

SQL

11/05/2017

Olá a todos.

Procurei inúmeras vezes uma solução para este problema, mas não encontrei especificamente uma solução.

Tenho uma consulta que busca valores em 3 tabelas diferentes, quando ela encontra duas linhas em uma das tabelas, as outras tabelas tem seus valores duplicados. Por exemplo.

SELECT A.identificador, SUM(B.campo1) + SUM(C.campo2) + SUM(D.campo3) FROM tabela_principal as A
LEFT JOIN tabela1 AS B ON B.identificador = A.identificador
LEFT JOIN tabela2 AS C ON D.identificador = A.identificador
LEFT JOIN tabela3 AS D ON C.identificador = A.identificador


Já tentei substituir o LEFT JOIN por um SUB SELECT (SELECT SUM(A.campo1) FROM tabela 1 AS B WHERE B.identificador = A.identificador), o que soluciona em partes meu problema, mas depois eu não consigo fazer GROUP BY.

Eu precisava relacionar estas tabelas de forma que eu pudesse fazer agrupamentos, de qual forma seria mais eficiente?

Obrigado a todos.
Alan Luna

Alan Luna

Curtidas 0

Melhor post

Fabio Parreira

Fabio Parreira

11/05/2017

Tente isso!
SELECT 
	IDENTIFICADOR,
	SUM(CAMPO1),
	SUM(CAMPO2),
	SUM(CAMPO3),
FROM
(
	SELECT
	A.identificador AS IDENTIFICADOR, 
	B.campo1 AS CAMPO1,
	C.campo2 AS CAMPO2,
	D.campo3 AS CAMPO3 
	FROM 
		tabela_principal as A
	LEFT JOIN 
		tabela1 AS B ON B.identificador = A.identificador
	LEFT JOIN 
		tabela2 AS C ON D.identificador = A.identificador
	LEFT JOIN 
	tabela3 AS D ON C.identificador = A.identificador
) AS CTE

GROUP BY IDENTIFICADOR

GOSTEI 3

Mais Respostas

Emerson Nascimento

Emerson Nascimento

11/05/2017

se eu entendi a sua questão...

SELECT A.identificador,
  (select SUM(B.campo1) from tabela1 AS B ON B.identificador = A.identificador) campo1,
  (select SUM(C.campo2) from tabela2 AS C ON C.identificador = A.identificador) campo2,
  (select SUM(D.campo3) from tabela3 AS D ON D.identificador = A.identificador) campo3
FROM
  (select distinct identificador from tabela_principal) as A
GOSTEI 1
Alan Luna

Alan Luna

11/05/2017

Olá a todos.

Peço desculpa pela demorar para retornar, tive alguns problemas de hardware.

Sobre minha questão, agradeço a todos, demorei um pouco pra entender as subquerys.

Pelo que entendi, minha solução seria criar uma primeira consulta para depois pesquisar sobre os resultados encontrados.

Ex.

SELECT * FROM --SELECT 2
(SELECT * FROM A --SELECT 1)
WHERE ...
GROUP BY ...


Desta forma, primeiro ele obtém a primeira consulta e, logo em seguida, realiza uma consulta com os resultados da primeira.

Consegui resolver o meu problema. Muito obrigado a todos.
GOSTEI 0
POSTAR