我有此表,其中TT_PLAN_TASK_ID在TT_GROUP_ID中具有其父代的ID:



这表示树数据如下:



我想按树的顺序对表数据进行排序。
我认为,如果可以按照指示计算“嵌套级别”,那么就像在嵌套级别+ tt_fromdate上排序一样简单。

想法/要求:


级别数是无限的。对于有限数量的级别,我只能执行一些repeated joins on the same tableThis approach looked nice too,但深度有限。
我无法使用存储过程(然后计算嵌套级别将很容易)
最终,它必须在Firebird,MS SQL,Oracle上运行。 Oracle的CONNECT BY似乎是一个选择,但这并不能解决其他两个问题。
当组节点处于同一级别且起始日期相同时,它们的顺序无关紧要(树形视图中的ID 225和226都始于2012年4月28日,226可以早于225或之后)
速度并不重要,它只是一次转换,我不希望客户拥有20个以上的等级
[edit]我只是注意到我的第二张图片应该计数为0 1 2 3,而不是0 1 2 3 4 ;-)


如何计算此嵌套级别?
或这是从哪里来的:如何按树排序?

最佳答案

您需要使用递归查询来识别和标记数量未知的级别。这是一个如何以tsql(sql-server)语法生成它的示例。我让您来制定其他数据库查询,但是所有技术都具有相当的等效性。

WITH tmpCTE (all_other_fields, TT_PLAN_TASK_ID, TT_GROUP_ID, [level]) as
(

    SELECT all_other_fields, TT_PLAN_TASK_ID, TT_GROUP_ID, 0 as [level]
    FROM #myTable
    WHERE TT_GROUP_ID = 0

    UNION ALL

    SELECT t.all_other_fields, t.TT_PLAN_TASK_ID, t.TT_GROUP_ID, [level] + 1
        FROM #myTable t
            INNER JOIN tmpCTE cte
                ON t.TT_GROUP_ID = cte.TT_PLAN_TASK_ID

)

SELECT * FROM tmpCTE order by level


但是,我认为您会发现这不足以产生您要创建的订单。您需要发送某种“完整地址”,其中包含一行可排序值的整个“级别血统”。考虑这个清单

PARENT - A
 child 1
 child 4
 child 9

PARENT - B
 child 2
 child 3


'child 2'和'child 3'低于'child 4'和'child 9'-因为它们是后一个父节点的孩子。因此,您必须带上某种代码或元数据才能使排序正常工作。

总而言之,这种排序和格式并不是关系数据库的优势。在我看来,由于您需要连接到许多不同的数据源,因此可以在应用程序层中更好地处理这种工作。在这里,您可以灵活地与多个数据库源进行对话,并已经为要进行的某种迭代构建了许多树状视图控件和集合-以及大量其他功能。

关于sql - 如何在建立为邻接表模型的表中确定“嵌套级别”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26102932/

10-12 00:39
查看更多