Ir para conteúdo
Fórum Script Brasil
  • 0

LEFT OUTER JOIN


renan

Pergunta

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

  • 0

Olá Fulvio :)

O Contato 1 é da Empresa 1

O Gerente 1 é da Empresa 1

Exemplo:

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 por renan
Link para o comentário
Compartilhar em outros sites

  • 0

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).

Link para o comentário
Compartilhar em outros sites

  • 0

Prezado Fulvio

90% FUNCIONOU

Criei um campo: CON_LINHA(INT), na tabela CONTATO e GER_LINHA(INT), na tabela GERENTE

Esses 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 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

AND G. GER_LINHA = C. CON_LINHA

ORDER BY E.EMP_ID

Perfeito, exibe assim:

EMPRESA 1 - CONTATO 1 - GERENTE 1

EMPRESA 1 - CONTATO 2 - GERENTE 2

Perfeito tambem se adicionar o 3º contato exibe assim:
EMPRESA 1 - CONTATO 1 - GERENTE 1

EMPRESA 1 - CONTATO 2 - GERENTE 2

EMPRESA 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 1

EMPRESA 1 - CONTATO 2 - GERENTE 2

Eu estou errando na consulta ou na forma que relaciono a tabela?

Muito Obrigado pela força :)

Editado por renan
Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde Renan,

Agora você terá q alterar o seu select. Execute os dois e veja o resultado:

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

AND G. GER_LINHA = C. CON_LINHA

ORDER BY E.ID

SELECT *

FROM EMPRESA E

LEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_ID

LEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_ID

AND G. GER_LINHA = C. CON_LINHA

ORDER 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. :.)

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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 por renan
Link para o comentário
Compartilhar em outros sites

  • 0

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!!! :.)

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...