CTE查询的结果没有按级别排序,为什么?

时间:2012-07-25 15:00:00

标签: sql sql-server common-table-expression recursive-query

更新: 我问了这个问题,因为结果看起来不像是怎么执行的......这里解释一下: http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

我还有另外一个问题...... 如果我不需要相同的父级和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           

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

我正在使用递归查询来查找Hierarchy表中的所有父项,以查找Items表中的项目;我认为结果应该是Level,但它不是......我知道我可以使用order by来排序它,我只是认为输出本身应该按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

1 个答案:

答案 0 :(得分:2)

数据库中的数据未订购。如果您没有放置order by,则无法确定输出的顺序。

永远不要认为数据库会以你想象的方式做事,90%的时候都是错的。数据库的目标是了解您的查询并找到找到解决方案的最快方法,而且通常不是您的想法。

根据您的编辑,但有时您可以要求它解释用于查找解决方案的计划,它可能会为您解释如何获得结果。