如果我已经明白了,您希望以所需顺序输出记录,而不是将它们插入到表格中。在这里我们看到帖子树,所以我认为你应该使用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 ║
╚══════════╩═══════════╩══════════╩═════════════════════════╩══════════╩═════════════╝
多少应答可以一给父母的评论有?有不定数量的答复吗? –
SQL数据本质上是**无序的** - 因此,您不能**在两个现有行之间插入一行 - 仅将其添加到表的末尾。您从表中选择数据时只会获得一个**订单**,并明确指定一个ORDER BY条款... –
您可以删除现有的并通过安排使用临时表再次重新输入。 – Susang