使用连接显示两组结果的存储过程
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、...)
假设我有两个表
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、...)