Daisy链式SQL记录

时间:2013-05-01 06:17:18

标签: sql-server

假设我有一个名为Messages的表,其中包含以下字段:

  • MessageID,
  • MessageTitle,
  • 消息体,
  • MessageDate,
  • 的ReplyTo

ReplyTo字段属于int类型,可以是null(当邮件不是对其他邮件的回复时)或某些其他邮件MessageID的值。因此,可以选择将消息设置为对预先存在的消息的回复。

是否可以有一个返回记录列表的查询,从特定消息开始,然后是它回复的记录。反过来,第二条记录后面会有一条消息,它是对......的回复等等。 如果涉及递归,我想有一些。

抱歉我没有使用正确的术语来实现我的目标。我不知道它究竟叫什么,因此我不知道在谷歌要找什么。

1 个答案:

答案 0 :(得分:2)

希望这有助于实现方法:

CREATE TABLE [dbo].[messages](
    [id] [int] NOT NULL,
    [replyto] [int] NOT NULL,
    [title] [nvarchar](max) NULL,
    [body] [nvarchar](max) NULL,
    [created_at] [datetime] NULL
) ON [PRIMARY]

然后选择这样的数据:

WITH Children (id, replyto, title, body, created_at) AS (
  SELECT id, replyto, title, body, created_at
  FROM [messages]
  WHERE replyto = -1 -- all msg from root
  UNION ALL
  SELECT b.id, b.replyto, b.title, b.body, b.created_at 
  FROM Children a, [messages] b
  WHERE a.id = b.replyto
)
SELECT id, replyto, title, body, created_at FROM Children

在我的示例中,replyto不可为空,因此我将-1定义为root消息。 如果你想要一个特定的消息+他们的孩子,那么你修改第一个SELECT语句。