我有此表,其中TT_PLAN_TASK_ID在TT_GROUP_ID中具有其父代的ID:
这表示树数据如下:
我想按树的顺序对表数据进行排序。
我认为,如果可以按照指示计算“嵌套级别”,那么就像在嵌套级别+ tt_fromdate上排序一样简单。
想法/要求:
级别数是无限的。对于有限数量的级别,我只能执行一些repeated joins on the same table。 This 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/