你想用一個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