【问题标题】:Stored Procedure to display two set of results using joins使用连接显示两组结果的存储过程
【发布时间】:2015-12-29 13:17:34
【问题描述】:

假设我有两张桌子

  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

上面的查询可以很好地显示发件人的消息和用户 ID(MsgFrom),但我想显示存储在 tblAllUsers 中的发件人的名称。我在 grdiview 中使用它。我不确定我是否我正在解释它的最佳方式。

问题是 join 已经根据 tblMessages.MsgTo = tblAllUsers.UserId 加入两个表。那么我怎么可能通过 tblMessages.MsgFrom = tblAllUsers.UserId 来获取发件人姓名呢?

【问题讨论】:

  • 在 where 子句之前添加:inner join tblAllUsers on tblMessages.MsgFrom = tblAllUsers.UserId
  • 并将 select * 替换为您在 proc 中真正需要的列名
  • @JulienVavasseur - “FROM 子句中的对象“tblAllUsers”和“tblAllUsers”具有相同的公开名称。使用相关名称来区分它们。”

标签: sql-server stored-procedures inner-join


【解决方案1】:

您必须使用别名(AS 别名)才能在同一个表上进行双重联接:

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

别名还使您的生活更轻松,因为您不必每次都重复完整的表名。 见Using Table Aliases

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

【讨论】:

    【解决方案2】:

    您需要加入 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 时使用了别名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      相关资源
      最近更新 更多