Ir para conteúdo

Arquivado

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

CaioCRS

Particularidades de um Inner Join

Recommended Posts

Fala pessoal, estou há algum tempo sofrendo com Inner Joins, o problema é que quando faço um Select em determinadas tabelas, são listados X campos, até aí OK. Mais quando tento cruzar dados, através de IDs FK entre tabelas, para trazer mais dados ao meu Select, muitas vezes estes dados são duplicados, triplicados ou dependendo se multiplicam muito, fazendo com o que um simples Select de 600 linhas vire um select enorme com 400.000 linhas...Já ouvi falar que depende da forma que se une as tabelas através do Inner Join, sobre o uso tbm do left e right Join, mas tudo quanto é conteúdo que encontro na internet sempre é mencionado o que eu já sei, o básico, comparar os IDs de várias tabelas e trazer os campos referente a este id para compor um único select...

Alguém poderia dar uma luz, e explicar claramente o que fazer para um select ser íntegro, e eu não correr o risco de trazer informações demais. Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

CaioCRS,

como que esta o relacionanemto entre as tabelas envolvidas?

O que pode estar acontecendo, é existir mais de um registro para o msm ID.

Chegou a fazer um count nas tabelas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A.Jr,

 

As tabelas que tentei ligar, estão todas com registros únicos, ou seja, para o usuário João ID 1, em todas estas tabelas só tem 1 linha para o mesmo. Porém, existem algumas tabelas que esta identificação não existe, então eu uno a tabela com um outro registro existente na tabela principal, exemplo:

select u.id, p.nomePessoa, em.descricaoEmprego, hb.descricaoHobby, tf.numResidencial, op.descricaoOperadora 
from usuario u 
inner join dbo.pessoa p on u.idpessoa = p.idpessoa
inner join dbo.emprego em on u.idemprego = em.idemprego
inner join dbo.hobby hb on u.idhobby = hb.idhobby
inner join dbo.telefone tf on u.idtelefone = tf.idtelefone
inner join dbo.operadora op on tf.idoperadora = op.idoperadora --aqui é o problema, tenho uma tabela que preciso exibir o seu valor neste select, porém esta tabela não tem relação nenhuma com a minha tabela principal ( tabela usuario ), assim começa a folia de ir multiplicando as linhas...

Como pode perceber, o banco que estou trabalhando é beeem normalizado, então existem muitas tabelas onde tenho que combinar ids diferentes que não tem relação com a minha tabela principal, que no exemplo acima é o usuario, onde preciso relacionar determinados dados deste, mas no caso do meu banco atual, são dezenas de tabelas com informações, e nisso acaba multiplicando, e como disse, uma consulta que era para aparecer 600 linhas, passou de 400.000 kkkkk

 


*Já utilizei o Select Distinct e reduziu apenas algumas linhas... =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

que comece que folia entao... :p

brincadeiras a partes, vamos aos relacionamentos:

1:1 para as tabelas usuario, pessoa, emprego, hobby e telefone, correto? ou seja, um usuario eh uma pessoa que tem somente um emprego e somente um hobby e somente um telefone?!

Pra mim, seria 1:N em telefones.....

 

A tabela de telefone tem uma FK de Operadora? Mas ai eh um pra um nao? ou seja, um telefone para uma operadora.

 

Tem como postar a estrutura das chaves que estao sendo utilizadas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então A.Jr. Quanto a esta questão de relação 1:1 e 1:N não havia pensado ainda, está correto, seria 1:1 para pessoa, emprego e hobby, e 1:N para telefone, para Operadora apenas a tabela Telefone se relacionaria.

Infelizmente não posso publicar o banco real, nem mesmo um trechinho, pois se trata de informação da empresa, e isso daria uma dor de cabeça enorme, por isso criei esta situação do usuário com seus demais atributos para representar +/- o meu problema.
No caso desta relação de operadora com telefone, a tabela telefone teria uma fk de operadora, que seria 1:1.
Como posso tratar esta situação, que no caso de meus Selects, normalmente aí começaria a multiplicar as linhas kkkk

 

Valeu A.Jr.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sei como é.

Algumas empresas que presto consultoria não posso nem citar nos fóruns :p

Entao, os dados podem começar a se duplicar nos telefones... ou seja, se uma pessoa tiver 4 telefones ela vai aparecer 4 vezes.

O que você pode fazer, é tratar com o PIVOT TABLE. conhece?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pivot? Ao invés de os telefones serem listados um em baixo do outro fazendo com que o usuário se repita, os telefones serão listados horizontalmente? Correto?
Não lembro como é sua sintaxe, vou pesquisar sobre.

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.