2012-07-25 76 views
-1

更新: 我問的問題,因爲結果並不像它是如何執行的?這是在這裏解釋: http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspxCTE查詢的結果未按Level排序,爲什麼?

嗯,我還有一個問題... 如果我不需要相同父母和級別,是否有可能只返回一個父母一次使用CTE(而不是後面的選擇)或者其他一些SQL?

=========================== 期望的結果是這樣的:

...... 
    54   4   
    **** the above is anchor member, the numbers are correct 
    4   1   
    1   0   
    2   1   
    36   35   
    35   8   
    8   1   
    54   12   
    12   1   
    11   1   
    3   1   

====== =====================

我正在使用遞歸查詢從層次表中找出所有父項,以查找項目表中的項目;我認爲結果應該是Level,但不是......我知道我可以使用order排序,我只是認爲輸出本身應該按Level排序,因爲Recursive Memeber是由Level運行的,對吧?

  WITH Result(ItemID, ParentID, Level) 
      AS 
      (
       --get the anchor member from tbItems 
       SELECT itemID, itemParentID, 0 AS Level 
       FROM tbItems WHERE 
        approved = 0 
       UNION ALL 
       --recursive member from tbHierarchy 
       SELECT h.hierarchyItemID, h.parentItemID, Level + 1 
       FROM tbHierarchy AS h 
       INNER JOIN 
        Result AS r 
         ON 
         h.hierarchyItemID = r.ParentID   

      ) 
      SELECT * 
      FROM Result 

結果是:

ItemID  ParentID Level 
    ----------- ----------- ----------- 
    7   3   0 
    11   2   0 
    18   11   0 
    19   11   0 
    21   54   0 
    31   2   0 
    33   36   0 
    34   36   0 
    35   36   0 
    36   36   0 
    38   2   0 
    39   2   0 
    40   2   0 
    54   4   0 
    **** the above is anchor member, the numbers are correct 
    4   1   1 
    1   0   2 
    2   1   1 
    1   0   2 
    2   1   1 
    1   0   2 
    2   1   1 
    1   0   2 
    36   35   1 
    35   8   2 
    8   1   3 
    1   0   4 
    36   35   1 
    35   8   2 
    8   1   3 
    1   0   4 
    36   35   1 
    35   8   2 
    8   1   3 
    1   0   4 
    36   35   1 
    35   8   2 
    8   1   3 
    1   0   4 
    2   1   1 
    1   0   2 
    54   12   1 
    12   1   2 
    1   0   3 
    11   1   1 
    1   0   2 
    11   1   1 
    1   0   2 
    2   1   1 
    1   0   2 
    3   1   1 
    1   0   2 
+5

您在外部查詢中沒有排序。這意味着SQL Server可以自由地以任何它認爲最有效的順序返回結果。如果你解釋你期望結果如何排序,我們可以向你展示如何用正確的順序修改查詢。 – 2012-07-25 15:05:23

+3

關於如何在沒有明確的'ORDER BY'的情況下返回行,從來沒有保證的順序,永遠不會 – Lamak 2012-07-25 15:06:29

+0

嗯...爲什麼-1?這個問題不應該被提出?這是我第一次使用CTE,... – 2012-07-25 16:24:44

回答

2

在一個數據庫中的數據是沒有順序的。如果您不輸入order by,則無法確定輸出的順序。

不要以爲數據庫會按照您的想法去做,90%的時間,這是錯誤的。數據庫的目標是理解你的查詢並找到找到解決方案的最快方法,而且這往往不是你想象的方式。

取決於您的編輯器,但有時您可以要求它解釋用於查找解決方案的計劃,它可能會給您一些關於如何獲得結果的解釋。

+0

好的。如果我只想返回父母一次,我需要使用順序?這是正確的方式嗎? – 2012-07-25 15:20:36

+0

@shrimprice你是什麼意思「只回饋父母一次」?正如我以前問過的,你可以*請*發佈期望的結果作爲你的問題的一部分? – 2012-07-25 15:28:15

+0

'ORDER BY'只會影響結果的順序。如果你想過濾結果或'GROUP BY'(在外部選擇)來消除雙打,你可以使用'WHERE'(在遞歸部分)。 – wishper 2012-07-25 15:28:56