2016-12-02 74 views
0

我有一个这样的表,它显示哪个用户对哪个父线程进行了注释。在SQL中插入两行之间的行

ParentID CommentID UserName CommentDateTime 
58   58  Vicky  2016-12-02 11:51:07.270 
58   61  Billu  2016-12-02 12:35:40.220 
58   62  Rakesh 2016-12-02 12:37:42.133 

如果假设一个注释到第二行所做,会生成新的commentid这是63

我想写一个sql查询其列出排在下面的顺序:

ParentID CommentID UserName CommentDateTime 
58   58  Vicky  2016-12-02 11:51:07.270 
58   61  Billu  2016-12-02 12:35:40.220 
61   63  Rakesh 2016-12-02 13:37:42.133 
58   62  Rakesh 2016-12-02 12:37:42.133 

你能帮我写一个逻辑/ SQL吗?

+0

多少应答可以一给父母的评论有?有不定数量的答复吗? –

+7

SQL数据本质上是**无序的** - 因此,您不能**在两个现有行之间插入一行 - 仅将其添加到表的末尾。您从表中选择数据时只会获得一个**订单**,并明确指定一个ORDER BY条款... –

+0

您可以删除现有的并通过安排使用临时表再次重新输入。 – Susang

回答

1

如果我已经明白了,您希望以所需顺序输出记录,而不是将它们插入到表格中。在这里我们看到帖子树,所以我认为你应该使用recursive CTE。对于每一个节点,我们建立一个路径字符串,然后排序的节点可以使用此路径字符串:

WITH CTE AS 
(
    SELECT ParentID, CommentID, UserName, CommentDateTime, 
      ParentID as ThreadID, 
      CAST(ParentID as varchar(MAX)) as PathStr 
    FROM T 
    WHERE CommentID = T.ParentID 

    UNION ALL 

    SELECT T.ParentID, T.CommentID, T.UserName, T.CommentDateTime, 
      CTE.ThreadID, 
      PathStr+'-' 
      +CAST(T.CommentID as varchar(MAX)) as PathStr 
    FROM T 
    JOIN CTE ON CTE.CommentID = T.ParentID 
    WHERE T.CommentID <> T.ParentID 
) 

SELECT * FROM CTE ORDER BY ThreadID,PathStr 

我增加更多的节点,以示例表所以这里是结果:

╔══════════╦═══════════╦══════════╦═════════════════════════╦══════════╦═════════════╗ 
║ ParentID ║ CommentID ║ UserName ║  CommentDateTime  ║ ThreadID ║ PathStr ║ 
╠══════════╬═══════════╬══════════╬═════════════════════════╬══════════╬═════════════╣ 
║  58 ║  58 ║ Vicky ║ 2016-12-02 11:51:07.270 ║  58 ║ 58   ║ 
║  58 ║  61 ║ Billu ║ 2016-12-02 12:35:40.220 ║  58 ║ 58-61  ║ 
║  61 ║  63 ║ Rakesh ║ 2016-12-02 13:37:42.133 ║  58 ║ 58-61-63 ║ 
║  58 ║  62 ║ Rakesh ║ 2016-12-02 12:37:42.133 ║  58 ║ 58-62  ║ 
║  158 ║  158 ║ Vicky ║ 2016-12-02 11:51:07.270 ║  158 ║ 158   ║ 
║  158 ║  161 ║ Billu ║ 2016-12-02 12:35:40.220 ║  158 ║ 158-161  ║ 
║  161 ║  163 ║ Rakesh ║ 2016-12-02 13:37:42.133 ║  158 ║ 158-161-163 ║ 
║  161 ║  164 ║ Rakesh ║ 2016-12-02 13:37:42.133 ║  158 ║ 158-161-164 ║ 
║  158 ║  162 ║ Rakesh ║ 2016-12-02 12:37:42.133 ║  158 ║ 158-162  ║ 
╚══════════╩═══════════╩══════════╩═════════════════════════╩══════════╩═════════════╝ 
+0

Valex,yes i只需要像CTE那样的查询,我可以显示如上所示的值。我整合了你的代码,但结果是空白的。如果你使用这个链接“http://stackoverflow.com/review/suggested-edits/14271418”,我问第一个问题,以显示父母的孩子,并得到答案。现在的问题是,如果新用户在父母的评论下,他的评论将在父母之下。您也可以在给定的链接中获取表格结构。 – Vikash

+0

@Vikash:我猜这是空白的,因为帖子树的结构不一样。在这个(当前)问题中,一个开始帖子已经获得了一个链接(58,58)。在之前的问题中,开始的帖子已经得到了'replycommentIId = NULL'。所以只是正确的可能回答和改变两个条件WHERE CommentID = T.ParentID' =>'WHERE CommentID IS NULL'和第二个条件'WHERE T.CommentID <> T.ParentID'=>'WHERE T.CommentID不是NULL '。这将有所帮助。 – valex

+0

@Vikash:我已经添加了[我的答案改编为您的早期问题的答案,请使用它](http://stackoverflow.com/a/40933557/1554034) – valex