你想用一个CTE
做到这一点,它本质上是一个亲子查询:
declare @MessageId int = 3;
with Conversations as
(
select
MessageId,
[Date],
[From],
[To],
Body,
[Subject],
[State],
ReplyId,
CAST(MessageId as varchar(max)) + '-' as hierarchy,
CAST(MessageId as varchar(max)) + '-' as TopMessageId
from
Messages
where
replyid is null
union all
select
m.MessageId,
m.[Date],
m.[From],
m.[To],
m.Body,
m.[Subject],
m.[State],
m.ReplyId,
c.hierarchy + CAST(m.MessageId as varchar(max)) + '-' as hierarchy,
c.TopMessageId
from
Conversations c
inner join Messages m on
c.MessageId = m.ReplyId
)
select
c2.MessageId,
c2.[Date],
c2.[From],
c2.[To],
c2.Body,
c2.[Subject],
c2.[State],
c2.ReplyId
from
Conversations c1
inner join Conversations c2 on
c2.hierarchy like c1.TopMessageId + '%'
where
c1.MessageId = @MessageId
order by c2.[Date] desc
如果您使用SQL Server 2008中,你可能要考虑使用你的桌子上一个hierarchyid
列一起避免CTE。
1.你能告诉您使用的是当前查询? 2.答案可以是在谈话中间的消息,还是仅在谈话开始时?即,如果您搜索replyId = messageId,您是否会始终获得所有答复。 – mellamokb 2011-12-30 15:00:25
我的查询:从消息为m 内加入消息作为答复上m.MessageId = reply.ReplyId 其中m.MessageId = @ messageId' 我 '声明@messageId INT = 4 选择答复* 。只能得到对messageId = 4的回复...但是,messageId = 1是回复messageId = 2,messageId = 2回复到messageId = 3,依此类推... 谢谢! – joaoasrosa 2011-12-30 15:07:40
通常情况下,回复消息中最好保留回复的消息ID,而不是其他方式 - 当前模型允许两条消息接收相同的回复消息(有点不寻常),并且不会有消息不止一次地回复 - 在这样的模型中,对话中的原始消息具有空值,然后从那里搜索回复。让对话中的每条信息*也参考原始信息可以改善事情。 – 2011-12-30 16:13:10