更新: 我问了这个问题,因为结果看起来不像是怎么执行的......这里解释一下: 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
答案 0 :(得分:2)
数据库中的数据未订购。如果您没有放置order by
,则无法确定输出的顺序。
永远不要认为数据库会以你想象的方式做事,90%的时候都是错的。数据库的目标是了解您的查询并找到找到解决方案的最快方法,而且通常不是您的想法。
根据您的编辑,但有时您可以要求它解释用于查找解决方案的计划,它可能会为您解释如何获得结果。