SQL - Junção de mais de um campo em tabelas com a mesma origem

30/01/2010

0


Se eu tiver as seguintes tabelas

Pessoas  (pk_pessoa, nome)
Tarefas  (pk_tarefa, fk_solicitante, fk_destinatario, descricao)

Gostaria de fazer uma consulta que substituisse os campos fk_solicitante e fk_destinatario pelos correspondentes na tabela Pessoas.

Se fosse só uma coluna era fácil, seria

SELECT * from Pessoas, Tarefas where Tarefas.fk_solicitante = Pessoas.pk_pessoa

ou

SELECT * from Pessoas INNER JOIN Tarefas ON Tarefas.fk_solicitante = Pessoas.pk_pessoa


Só que como tenho duas colunas, como é que poderia fazer isso? Tentei joins aninhados, mas não deu certo. Alguém sabe como poderia fazer isso?

Se tivesse os seguintes conteúdos:

Pessoas

+-----------+---------+
| pk_pessoa |  nome   |
+-----------+---------+
|     1     |  João   |
|     2     |  José   |
|     3     |  Maria  |
+-----------+---------+


Tarefas

+-----------+----------------+-----------------+---------------+
| pk_tarefa | fk_solicitante | fk_destinatario | descricao     |
+-----------+----------------+-----------------+---------------+
|     1     |       1        |        3        |  Tarefa 1     |
|     2     |       1        |        2        |  Tarefa 2     |
|     3     |       2        |        3        |  Tarefa 3     |
+-----------+----------------+-----------------+---------------+


O resultado desejado seria:

+-----------+--------------+--------------+---------------+
| pk_tarefa | solicitante  | destinatario | descricao     |
+-----------+--------------+--------------+---------------+
|     1     |  João        |   Maria      |  Tarefa 1     |
|     2     |  João        |   Maria      |  Tarefa 2     |
|     3     |  José        |   José       |  Tarefa 3     |
+-----------+--------------+--------------+---------------+


Com a solução trivial consegui fazer a substituição de uma das colunas, mas
como teria que fazer para substituir as duas, solicitante e destinatário?







Mauricio Lima

Mauricio Lima

Responder

Posts

30/01/2010

Mauricio Lima


Acabei conseguindo, mas não sei se essa é a melhor solução. Consegui duplicando a tabela de Pessoas na consulta. Fiz assim:

SELECT
             pk_tarefa, P1.nome as solicitante, P2.nome as destinatario, Tarefas.descricao as descricao
FROM
             Tarefas, Pessoas as P1, Pessoas as P2
WHERE
             Tarefas.pk_solicitante = P1.pk_pessoa AND Tarefas.pk_solicitante = P2.pk_pessoa



Seria essa a solução mais elegante e eficiente ou teria uma melhor??



Responder

03/02/2010

Wilson Junior

Segue a melhor maneira de ser feita. Pois colocando JOIN, a pesquisa é mais rápida.

SELECT
  tar.pk_tarefa,
  p1.Nome AS Solicitante,
  p2.Nome AS Destinatario,
  tar.Descricao
FROM
  TAREFAS tar
    INNER JOIN PESSOAS p1 ON ( tar.fk_solicitante = p1.pk_pessoa )
    INNER JOIN PESSOAS p2 ON ( tar.fk_destinatario = p2.pk_pessoa )

Espero ter colaborado.
Responder

16/05/2013

José

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar