SQL - Junção de mais de um campo em tabelas com a mesma origem
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
Curtidas 0
Respostas
Mauricio Lima
30/01/2010
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??
GOSTEI 0
Wilson Junior
30/01/2010
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.
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.
GOSTEI 0
José
30/01/2010
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0