Consulta com Join retornando valor duplicado

SQL Server

SQL

19/10/2018

Boa tarde, estou enfrentando um problema, preciso da ajuda de vocês.
Preciso extrair todos os campos das tabelas sem repetir o ItemId da InventTable.

Porém o relacionamento entre a InventTable e EcoResProduct é de 1:N.
Como resolvo essa situação?
Fiz uma consulta usando apenas as 2 tabelas.

SELECT * FROM InventTable	
	 WHERE InventTable.Product IN (SELECT EcoResProduct.RecId FROM EcoResProduct)


Retornou o que eu precisava, porém preciso das outras tabelas também, como incremento no código?

Código que estou usando;

SELECT * FROM InventTable	
	 --WHERE InventTable.Product IN (SELECT EcoResProduct.RecId FROM EcoResProduct)
	  JOIN  EcoResProduct ON InventTable.Product = EcoResProduct.RecId
	    LEFT JOIN  EcoResProductDimensionGroupProduct ON EcoResProductDimensionGroupProduct.RecId = EcoResProductDimensionGroupProduct.Product
		   LEFT join ECORESPRODUCTDIMENSIONGROUP ON ECORESPRODUCTDIMENSIONGROUP.RECID = ECORESPRODUCTDIMENSIONGROUPPRODUCT.PRODUCT
			 LEFT JOIN EcoResProductTranslation ON EcoResProduct.RecId = EcoResProductTranslation.Product
			 	LEFT JOIN InventItemGroupItem ON InventTable.ItemId = InventItemGroupItem.ItemId
				and InventTable.dataAreaId = InventItemGroupItem.ItemDataAreaId
						LEFT JOIN InventModelGroupItem ON InventTable.ItemId = InventModelGroupItem.ItemId
						and InventTable.dataAreaId = InventModelGroupItem.ItemDataAreaId
							LEFT JOIN EcoResStorageDimensionGroupItem ON InventTable.ItemId = EcoResStorageDimensionGroupItem.ItemId
							AND InventTable.dataAreaId = EcoResStorageDimensionGroupItem.ItemDataAreaId
								left  JOIN EcoResTrackingDimensionGroupItem ON InventTable.ItemId = EcoResTrackingDimensionGroupItem.ItemId
								and InventTable.dataAreaId = EcoResTrackingDimensionGroupItem.ITEMDATAAREAID
									left JOIN WHSInventTable ON InventTable.ItemId = WHSInventTable.ItemId
										WHERE INVENTTABLE.DATAAREAID = ''br01''
					
		ORDER BY INVENTTABLE.ITEMID


Resultado semelhante

ItemId    Language
000001    PT-BR
000001    EN
000001    USA
000002    PR-BR


Preciso que mostre apenas 1 vez a Conta o ItemId e traga todos os campos das outras tabelas.

Obrigado
Eduardo

Eduardo

Curtidas 1

Melhor post

Maicon Scapatici

Maicon Scapatici

25/10/2018

Bom dia! Você tentou usar um DISTINCT logo após o SELECT?
 SELECT DISTINCT * FROM WHERE 
GOSTEI 3

Mais Respostas

Alex Lekao

Alex Lekao

19/10/2018

Oi Eduardo, boa tarde!!!

Vamos ver se consigo de ajudar de alguma forma.

Vamos tentando ver o que conseguimos.

Fiz uma observação no seu codigo para eu entender melhor, e vamos vendo o que conseguimos.

SELECT 
   * 
FROM InventTable as IT
--WHERE IT.Product IN (SELECT EcoResProduct.RecId FROM EcoResProduct)
LEFT JOIN  EcoResProduct AS ERP ON IT.Product = ERP.RecId
LEFT JOIN  EcoResProductDimensionGroupProduct AS ERPDGP ON ERPDGP.RecId = ERPDGP.Product -- Aqui você vai relacionar a própria tabela com ela mesma?
LEFT join ECORESPRODUCTDIMENSIONGROUP AS ERPDG ON ERPDG.RECID = ERPDGP.PRODUCT
LEFT JOIN EcoResProductTranslation AS ERPT ON ERPT.Product = ERP.RecId
LEFT JOIN InventItemGroupItem AS IIGI ON IIGI.ItemId = IT.ItemId and IIGI.ItemDataAreaId = IT.dataAreaId
LEFT JOIN InventModelGroupItem AS IMGI ON IMGI.ItemId = IT.ItemId and IMGI.ItemDataAreaId = IT.dataAreaId 
LEFT JOIN EcoResStorageDimensionGroupItem AS ERSDGI ON ERSDGI.ItemId = IT.ItemId AND ERSDGI.ItemDataAreaId = IT.dataAreaId 
left  JOIN EcoResTrackingDimensionGroupItem AS ERTDGI ON ERTDGI.ItemId = IT.ItemId and ERTDGI.ITEMDATAAREAID = IT.dataAreaId 
left JOIN WHSInventTable AS WIT ON WIT.ItemId = IT.ItemId 
WHERE IT.DATAAREAID = ''br01''
ORDER BY IT.ITEMID


Evite utilizar * no select principal, informe quais os campos que vc quer visualizar, assim seu codigo fica mais limpo e acaba de certo modo melhorando o uso de memoria.

Atenciosamente,
GOSTEI 2
Tiago Souza

Tiago Souza

19/10/2018

Eduardo, você pode dar um exemplo do resultado que você deseja?
GOSTEI 0
POSTAR