2010-06-05 6 views
1

J'ai 2 tables. Pour simplifier:Sql rejoindre, 2 tables, mêmes champs

Tableau 1, les utilisateurs:


userId int, userName nvarchar (50)


Tableau 2, les messages:


MSGID int, msgDepuis int, msgTo int ...


msg1 et msg2, tous les deux contiennent userId. Maintenant, je veux obtenir tous les messages, mais au lieu de la msgFrom je veux le nom d'utilisateur. Je sais que faire ici:

select tabMessages.*, tabUsers.userName as Sender 
     from tabMessages 
inner join tabUsers on msgFrom=userId 
where msgId = @someParameter; 

Tout fonctionne bien et dandy. La même chose pour obtenir le nom d'utilisateur au lieu de msgTo. Maintenant, le problème est, comment puis-je faire pour obtenir les deux champs dans le même appel? Je veux la table


MSGID, msgEmetteur, msgA, expéditeur, destinataire. J'ai essayé comme:

select tabMessages.*, tabUsers.userName as Sender, 
      tabUsers.userName as Recipient 
     from tabMessages 
inner join tabUsers on msgFrom=userId and msgTo=userId 
    where msgId = @someParameter; 

mais cela ne fonctionne pas. J'utilise Ms sql2000 en passant.

Répondre

8

Rejoindre la table des utilisateurs deux fois avec des alias différents. Première jointure à la colonne from, seconde à la colonne to.

select m.*, u1.userName as Sender, u2.userName as Recipient 
from tabMessages as m 
    inner join tabUsers as u1 
    on u1.userId=m.msgFrom 
    inner join tabUsers as u2 
    on u2.userId=m.msgTo 
where m.msgId = @someParameter; 
+0

+1. Mais s'il vous plaît formater votre SQL afin qu'il puisse être vu sans avoir à faire défiler horizontalement. – bernie

+0

merci, va faire :) – Anpher

1

Vous devez vous connecter deux fois aux onglets. L'un pour obtenir l'expéditeur, l'un pour obtenir le destinataire:

SELECT m.*, f.userName as Sender, t.userName as Recipient 
FRPOM tabMessages AS m 
    INNER JOIN tabUsers AS f on m.msgFrom = f.userId 
    INNER JOIN tabUsers AS t on m.msgTo = t.userId 
WHERE m.msgId = @someParameter;