使用连接显示两组结果的存储过程

Stored Procedure to display two set of results using joins

假设我有两个表

  Create table tblMessages
  (
  MessageId int primary key identity,
  Title nvarchar(max),
  Body nvarchar(max),
  MsgFrom nvarchar(10),
  MsgTo nvarchar(10),
  SentDateTime datetime,
  MsgRead int default 0
  )

  Create table tblAllUsers
  ( 
   Id int primary key identity,
   UserId nvarchar(100,
   FullName nvarchar(50)
  )

这是我尝试为登录用户显示消息的存储过程

  Alter proc spExtractInbox
  @UserId nvarchar(10)
  as
  begin
  Select * from tblMessages 
  INNER JOIN
  tblAllUsers ON tblMessages.MsgTo = tblAllUsers.UserId
  where tblMessages.MsgTo=@UserId order by tblMessages.SentDateTime desc
  end

上面的查询可以很好地显示发件人的消息和 UserId(MsgFrom),但我想显示存储在 tblAllUsers.I 中的发件人的名称,我在 [=24= 中使用它] 不确定我是否以最好的方式解释它。

问题是联接已经根据 tblMessages.MsgTo = tblAllUsers.UserId 联接两个表。那么我怎么可能做 tblMessages.MsgFrom = tblAllUsers.UserId 来获取发件人姓名?

您需要加入 allUsers 两次,发送者一次,接收者一次...

  SELECT * 
  FROM tblMessages 
  INNER JOIN tblAllUsers Rec
    ON tblMessages.MsgTo = Rec.UserId
  INNER JOIN tblAllusers Snd
    on tblMessages.MsgFrom = Rec.userID
  WHERE Rec.MsgTo=@UserId 
  ORDER BY tblMessages.SentDateTime desc

将 * 限制为仅需要的字段。 注意使用别名的第二个连接到 tblAllusers。

您必须使用别名(AS 别名)才能在同一个 table:

上进行双重连接
Select ... from tblMessages AS msg 
INNER JOIN tblAllUsers AS ut
    ON msg.MsgTo = ut.UserId
INNER JOIN tblAllUsers AS uf
    ON msg.MsgFrom = uf.UserId
where msg.MsgTo=@UserId or msg.MsgFrom=@UserId
order by tblMessages.SentDateTime desc

别名还可以让您的生活更轻松,因为您不必每次都重复完整的 table 名称。 参见 Using Table Aliases

将您需要的列添加到 select(msg.Title、ut.Fullname、...)