renan Postado Fevereiro 25, 2010 Denunciar Share Postado Fevereiro 25, 2010 Bom dia Pessoal.Eu tenho três tabelas e só consigo mostralas assim:EMPRESA 1 - CONTATO 1 - GERENTE 1EMPRESA 1 - CONTATO 1 - GERENTE 2EMPRESA 1 - CONTATO 2 - GERENTE 1EMPRESA 1 - CONTATO 2 - GERENTE 2 Obs:Se tiver contato3 ele gera mais duas linhasEu gostaria de mostralas assim:EMPRESA 1 - CONTATO 1 - GERENTE 1EMPRESA 1 - CONTATO 2 - GERENTE 2Uso este código:SELECT *FROM EMPRESA ELEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_IDLEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_IDORDER BY E.IDA Tabela “Contatos” e “Gerente” estão com o ID da “Empresa” ex: 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Fevereiro 25, 2010 Denunciar Share Postado Fevereiro 25, 2010 Bom dia Renan, Como, via sistema, você sabe que o "Contato 1" é do "Gerente 1" e assim por diante? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renan Postado Fevereiro 25, 2010 Autor Denunciar Share Postado Fevereiro 25, 2010 (editado) Olá Fulvio :)O Contato 1 é da Empresa 1O Gerente 1 é da Empresa 1Exemplo:A Tabela Contato e Gerente tem um campo EMP_ID.A Tabela Empresa tem um campo EMP_ID.De modo que: EMP_ID=1 (é da empresa 1).Conclusão Podemos dizer que:Contato 1 é da Empresa 1.Gerente 1 é da Empresa 1. Editado Fevereiro 25, 2010 por renan Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Fevereiro 25, 2010 Denunciar Share Postado Fevereiro 25, 2010 Boa tarde Renan, Ok. Estou perguntando isto pois as vezes não é o select, mas sim os relacionamentos que estão incorretos. Pelo que vi, a modelagem não está adequada. A Empresa se relaciona com o Gerente. A empresa se relaciona com o Contato (de acordo com a chave). A melhor forma de modelar seria: O Contato seria filho da tabela Gerente, e não da tabela Empresa (conforme seu caso, em que cada gerente tem seu contato). Caso o Contato seja filho da Empresa, o Gerente tem que ser filho do Contato. Ficaria assim, dependendo da sua regra de negócio: - Empresa --> Contato --> Gerente ou - Empresa --> Gerente --> Contato Na sua modelagem, a Empresa está com dois filhos. E foi esta a minha pergunta: com os dois filhos sem relacionamentos (Gerente e Contato), como saberei qual gerente está associado a qual contato? :.) Para este caso, não há como resolver com um simples select. Ou remodela ou coloca uma chave ligando os dois filhos (Gerente e Contato). Ai você fará uma triangulação entre as tabelas (funciona, mas a remodelagem é a melhor escolha). Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renan Postado Fevereiro 25, 2010 Autor Denunciar Share Postado Fevereiro 25, 2010 Poxa vida FulvioIsso que você explicou nem faculdade ensina...Entendi perfeitamente vou fazer da forma que você me ensinou e volto para expor o resultado aqui.Obrigado :) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Fevereiro 25, 2010 Denunciar Share Postado Fevereiro 25, 2010 Boa tarde Renan, Por nada. Quando resolver posta aí!!! :.) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renan Postado Fevereiro 26, 2010 Autor Denunciar Share Postado Fevereiro 26, 2010 (editado) Prezado Fulvio90% FUNCIONOUCriei um campo: CON_LINHA(INT), na tabela CONTATO e GER_LINHA(INT), na tabela GERENTEEsses campos são preenchidos de acordo com o Nº ex: se tiver 3 GERENTES o quarto recebe GER_LINHA=4, e CONTATO a mesma coisa.E chamei assim:SELECT *FROM EMPRESA ELEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_IDLEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_IDAND G. GER_LINHA = C. CON_LINHAORDER BY E.EMP_IDPerfeito, exibe assim:EMPRESA 1 - CONTATO 1 - GERENTE 1EMPRESA 1 - CONTATO 2 - GERENTE 2Perfeito tambem se adicionar o 3º contato exibe assim:EMPRESA 1 - CONTATO 1 - GERENTE 1EMPRESA 1 - CONTATO 2 - GERENTE 2EMPRESA 1 - CONTATO 3 - <null>Mas se a quantidade de GERENTE for Maior que contatos (ex 2 CONTATOS e 3 GERENTES), ai não aparece GERENTE, exibe assim:EMPRESA 1 - CONTATO 1 - GERENTE 1EMPRESA 1 - CONTATO 2 - GERENTE 2Eu estou errando na consulta ou na forma que relaciono a tabela?Muito Obrigado pela força :) Editado Fevereiro 26, 2010 por renan Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Fevereiro 26, 2010 Denunciar Share Postado Fevereiro 26, 2010 Boa tarde Renan, Agora você terá q alterar o seu select. Execute os dois e veja o resultado:SELECT *FROM EMPRESA ELEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_IDLEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_IDAND G. GER_LINHA = C. CON_LINHAORDER BY E.IDSELECT *FROM EMPRESA ELEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_IDLEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_IDAND G. GER_LINHA = C. CON_LINHAORDER BY E.ID Perceba que o SQL é excludente!! Outra coisa: você não precisa criar uma coluna nas duas tabelas (Contato e Gerente). você terá que determinar quem é a mãe e o filho (de acordo com sua regra de negócio). - Contato --> Gerente Se for assim, pegue a chave (PK) da Contato, e coloque-a na Gerente (que será FK). - Gerente --> Contato Se for assim, pegue a chave (PK) da Gerente , e coloque-a na Contato (que será FK). Qualquer dúvida, pode postar. :.) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renan Postado Fevereiro 26, 2010 Autor Denunciar Share Postado Fevereiro 26, 2010 (editado) Vamos supor que eu declaro que:Contatos é MãeGerentes é Filho.Se possuir:1 Empresa e 2 GerentesO SQL me mostra mesmo não existindo Contatos os gerentes?Muitíssimo Obrigado :) Editado Fevereiro 26, 2010 por renan Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Fevereiro 26, 2010 Denunciar Share Postado Fevereiro 26, 2010 Boa tarde Renan, No seu exemplo: Contatos é Mãe / Gerentes é Filho. Se você tiver a chave que liga a Empresa com o Gerente, você consegue. Caso não exista este relacionamento, não conseguirá mostrar os Gerentes. Esse negócio tá fincando meio complexo.. rs. Uma dúvida: dá pra ajuntar as tabelas Contatos e Gerentes? Aí você resolve este problema. você coloca os campos podendo inserir nulo. Coloca a FK da Empresa e fim. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 renan Postado Março 3, 2010 Autor Denunciar Share Postado Março 3, 2010 (editado) Caro amigo Fulvio..Fiquei contente em saber que você ganhou o posto de Moderador.Vejo que nosso conceito em SQL está em boas mãos :)Sobre o problema:A sua idéia de preencher os campos como <null> serve como alternativa, mas no meu caso não daria certo..Irei tentar a solução caso eu consiga postarei aqui para colocarmos [RESOLVIDO] no titulo deste post..Muito obrigado....;) Editado Março 3, 2010 por renan Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 fulvio Postado Março 3, 2010 Denunciar Share Postado Março 3, 2010 Boa tarde Renan, Obrigado pelo elogio! Precisando estamos ai. Em relação ao seu problema, caso a regra de negócio obrigue, você poderá fazer a triangulação entre as 3 tabelas. Sempre digo que não existe errado ou certo, mas sim a melhor forma. A triangulação é uma forma!!! :.) Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
renan
Bom dia Pessoal.
Eu tenho três tabelas e só consigo mostralas assim:
EMPRESA 1 - CONTATO 1 - GERENTE 1
EMPRESA 1 - CONTATO 1 - GERENTE 2
EMPRESA 1 - CONTATO 2 - GERENTE 1
EMPRESA 1 - CONTATO 2 - GERENTE 2
Obs:Se tiver contato3 ele gera mais duas linhas
Eu gostaria de mostralas assim:
EMPRESA 1 - CONTATO 1 - GERENTE 1
EMPRESA 1 - CONTATO 2 - GERENTE 2
Uso este código:
SELECT *
FROM EMPRESA E
LEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_ID
LEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_ID
ORDER BY E.ID
A Tabela “Contatos” e “Gerente” estão com o ID da “Empresa” ex: 1
Link para o comentário
Compartilhar em outros sites
11 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.