2010-06-05 65 views
1

我有2个表。为了简化:Sql join,2表,相同字段

表1中,用户:


用户id INT, 的userName为nvarchar(50)


表2中,消息:


的msgId INT, msgFrom int, msgTo int ...


msg1和msg2都包含userId。现在我想获取所有消息,但不是msgFrom我想要用户名。我知道该在这里做什么:

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

一切工作正常和丹迪。获取用户名而不是msgTo也是一样。现在的问题是,我该如何在同一个电话中获得BOTH字段?我想让表格成为


msgId,msgFrom,msgTo,Sender,Recipient。我试图:

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

但这并不起作用。我正在使用Ms sql2000。

回答

8

用不同的别名加入用户表两次。首先加入from列,第二加入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。但请格式化您的SQL,以便在不必水平滚动的情况下查看它。 – bernie 2010-06-05 20:35:49

+0

谢谢,会做:) – Anpher 2010-06-05 20:41:04

1

您需要加入到tabUsers两次。一个让发件人,一个让收件人:

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;