【发布时间】:2016-12-30 13:40:44
【问题描述】:
我遇到了在 SQL 查询中按逻辑创建订单的问题:
查询如下:
WITH CTE AS ( SELECT CommentID ,
CommentUserName,
ReplyCommentID ,
CommentID AS ThreadID ,
CAST( CommentID AS VARCHAR( MAX ) ) AS PathStr,
HtmlComment ,
CommentPostDocumentID ,
CommentIsApproved,
CommentDate
FROM Blog_CommentDetails AS T WITH(NOLOCK)
WHERE ReplyCommentID IS NULL
UNION ALL
SELECT T.CommentID ,
T.CommentUserName,
T.ReplyCommentID ,
CTE.ThreadID ,
PathStr + '-'+ CAST( T.ReplyCommentID AS VARCHAR( MAX ) ) AS PathStr,
T.HtmlComment ,
t.CommentPostDocumentID ,
t.CommentIsApproved,
T.CommentDate
FROM Blog_CommentDetails AS T WITH(NOLOCK)
JOIN CTE
ON T.ReplyCommentID = CTE.CommentID
WHERE T.ReplyCommentID IS NOT NULL)
SELECT *
FROM CTE
WHERE CommentPostDocumentID = 15 AND CommentIsApproved=1
ORDER BY ThreadID, PathStr ,
CommentDate DESC;
它显示以下结果:
变化是,我需要在commentid - 144之后插入记录,因为回复commentid和commentid是一样的。
意味着只要有匹配的 commentid 和 replycommentid ,在本例中是 144,那么带有 replycommentid 的行应该下降到带有 commentid 144 的行。
答案的查询列表:
【问题讨论】:
-
这个新订单背后的逻辑是什么?
-
订单应该和我最初的查询一样,如果replyid匹配则需要插入,现在插入发生在最后一个,现有订单不应该改变它应该保持不变
-
试着用文字写下你想要的。关于查询的输出顺序,仅保证
ORDER BY子句中指定的顺序。否则,如果SQL-Server选择不同的执行计划,您可能会得到不同的结果顺序,即使对于相同的查询也是如此。 -
另外,避免使用“insert”,除非您实际上是在谈论
inserting。由于您是在选择而不是插入,因此很混乱。
标签: sql .net sql-server tsql logic