2016-12-30 89 views
0

我現在面臨的問題在SQL查詢的邏輯創建順序: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; 

它顯示了以下結果:

Query Result

但是預期的結果是: enter image description here

變化是,我需要在紀念日之後插入紀錄 - 144,因爲紀念和紀念的回覆是一樣的。

意味着每當有匹配commentid和replycommentid,在這種情況下它的144,然後用replycommentid行應回落到該行具有commentid 144

查詢房源的答案:

query result for DVT

+0

這個新訂單背後的邏輯是什麼? – DVT

+0

訂單應該保持與我的初始查詢相同,如果replyid匹配,則需要插入,現在插入發生在最後,現有訂單不應該改變它應該保持不變 – SmartestVEGA

+0

試着寫下你想要的單詞。關於查詢輸出的順序,只保證'ORDER BY'子句中指定的順序。否則,如果'SQL-Server'選擇不同的執行計劃,則即使對於相同的查詢,您也可能得到不同的結果順序。 – DVT

回答

1

如何通過父記錄相結合的commentID串與當前記錄排序

WITH CTE AS (SELECT CommentID , 
       CommentUserName, 
       ReplyCommentID , 
       CommentID AS ThreadID , 
       CAST(CommentID AS VARCHAR(MAX)) AS PathStr, 
       HtmlComment , 
       CommentPostDocumentID , 
       CommentIsApproved, 
       CommentDate , 
       CAST('' AS VARCHAR(MAX)) AS NewPathStr -- added 
     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,    
       CTE.NewPathStr+'--'+CAST(cte.CommentID AS VARCHAR(MAX)) + '-' + CAST(t.CommentID AS VARCHAR(MAX)) AS NewPathStr --added 
     FROM Blog_CommentDetails AS T WITH(NOLOCK) 
     JOIN CTE 
     ON T.ReplyCommentID = CTE.CommentID 
     WHERE T.ReplyCommentID IS NOT NULL) 

SELECT * -- You might have to remove NewpathStr if you do not want to see it 
    FROM CTE 
    WHERE CommentPostDocumentID = 15 AND CommentIsApproved=1 
    ORDER BY ThreadID, NewPathStr, PathStr , 
      CommentDate DESC; 
+0

不工作,問題是newpathstr始終爲空 – SmartestVEGA

+0

oops。忘記一個空字符串和一個空字符串是不同的。 @SmartestVEGA固定。 – DVT

+0

現在我的要求是上市罰款,這是144後它插入答覆通知144,但查詢的順序去了折騰,匹配兩個記錄插入最後和倒數第二個位置,理想情況下,它應該在第二個和第三個位置 – SmartestVEGA

0

這是深第一種方法,並且可以使用ORDER BY從而HIERARCHYID值來實現:

(1) ORDER BY 的ThreadId, CONVERT(HIERARCHYID, '\' + REPLACE(PathStr, ' - ',「\ 「)+ '\'), CommentDate

(2)在遞歸CTE我會產生PathStr作爲hirarchyid值。

注意:我沒有測試過這個解決方案。 注意#2:抱歉格式不對:我正在將這個答案寫在我的手機上。