Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

danielsjdr

INNER JOIN Complicado

Recommended Posts

Bem pessoal,Precisso fazer uma consulta em SQL só que ela ta repetindo erro... vamos lá:

Tabela 1:IDPRD - Id interno e auto incCODIGOPRD - Codigo usado pelo usuárioNOMEFANTASIA - Nome do produtoTabela 2:IDPRDCODFILIAL - Codigo da FilialCODLOC - Codigo do local de estoque (uma filial pode ter vários locais de estoque)SALDOFISICOTabela 3:IDPRDCODFILIALCODLOCSALDOMAX - Maximo de produtos que devem estar em estoqueSALDOMIN - Minimo de produtos que devem estar em estoque

Já deu para sacar qual a consulta né:Selecionar CODIGOPRD, NOMEFANTASIA, SALDOFISICO, SALDOMAX, SALDOMINBásico né... Só que quando faço o Inner Join ele repete, por exemplo, se eu tenho 4 locais de estoque, ele repete os resultados indicando CODLOC 4 vezes para cada filial...Vou tentando dakiAttDaniel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Distinct não funcionou...

 

mas funcionou da seguinte maneira...

 

select CODIGOPRD, NOMEFANTASIA, D1.SALDOFISICO2, D1.CODLOC, D2.SALDFISMIN, D2.SALDOFISMAXfrom TPRD Dinner join TPRDLOCINFO D2 on D2.idprd  = D.idprdinner join TPRDLOC D1	 on D1.codloc = D2.codlocWHERE CODIGOPRD = '10.001.00002'AND (SALDOFISICO2 <> '0')AND ((D1.CODLOC = D2.CODLOC) AND (D2.IDPRD = D1.IDPRD))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo,Também sou consultor de implantação RM Sistemas no sul. Acho que assim ficaria melhor...observe que faltou o relacionamento da tprdlocinf com a tprdloc e a tprd. o idprd é a chave nestas tabelas, chave primaria na tprd. codloc é uma informação adicional, para filtragens. alem disto, você não deve ter o caso de coligada na base, mas acho conveniente declarar o codcoligada, pois vai que amanhã ou depois o cliente agrega uma empresa, ai te ferra em tudo. o mesmo vale para codfilial. Lembrando, que esta query trará somente registros que existão em todas as tabelas. se for retornar dados, mesmo que não estejam na tprdlocinf, use left outer join.Uma dica que pode ser boa, é usar sp_help '<nome_da_tabela_ou_objeto>". com este, você pode saber mais sobre os relacionamentos da tabela, sem ter que ir até o enterprise manager. ficaria assim no query analyser sp_help 'tprd', sp_help 'tprdloc' e por ai vai, basta saber o nome da tabela.segue:select CODIGOPRD, NOMEFANTASIA, D1.SALDOFISICO2, D1.CODLOC, D2.SALDFISMIN, D2.SALDOFISMAXfrom TPRD D inner join TPRDLOC D1 on (D.CODCOLIGADA=D1.CODCOLIGADA AND D.IDPRD = D1.IDPRD)inner join TPRDLOCINFO D2 on (D2.CODCOLIGADA = D.CODCOLIGADA AND D2.IDPRD = D.IDPRD AND D2.CODFILIAL = D1.CODFILIAL AND D2.CODLOC = D1.CODLOC)WHERE CODIGOPRD = '10.001.00002'AND D1.SALDOFISICO2 <> '0'ouselect CODIGOPRD, NOMEFANTASIA, D1.SALDOFISICO2, D1.CODLOC, D2.SALDFISMIN, D2.SALDOFISMAXfrom TPRD D,TPRDLOC D1,TPRDLOCINFO D2WHERE D.CODCOLIGADA = D1.CODCOLIGADAAND D.IDPRD = D1.IDPRDAND D2.CODCOLIGADA = D.CODCOLIGADAAND D2.IDPRD = D.IPDPRDAND D2.CODFILIAL = D1.CODFILIALAND D2.CODLOC = D1.CODLOCAND CODIGOPRD = '10.001.00002'AND D1.SALDOFISICO2 <> '0'Espero ter ajudado. quelquer coisa, manda mail. corgusrod@gmail.com.att,rodcorgus

Distinct não funcionou...mas funcionou da seguinte maneira...

select CODIGOPRD, NOMEFANTASIA, D1.SALDOFISICO2, D1.CODLOC, D2.SALDFISMIN, D2.SALDOFISMAXfrom TPRD Dinner join TPRDLOCINFO D2 on D2.idprd  = D.idprdinner join TPRDLOC D1	 on D1.codloc = D2.codlocWHERE CODIGOPRD = '10.001.00002'AND (SALDOFISICO2 <> '0')AND ((D1.CODLOC = D2.CODLOC) AND (D2.IDPRD = D1.IDPRD))
outra coisa, lembrand oque para cubos do bis, o inner join e left outer join tornam a consulta muito mais rapida. já tive consultas de 10 minutos caindo para 6, simplesmente, por trocar a comparação da clausula where para join...até...att,rodcorgus

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.