嵌套集:如何对父母的孩子进行排序?

时间:2019-06-15 23:35:52

标签: sqlite nested-sets nested-set-model

我正在使用SQLite中的经典lft / rgt嵌套集树,如Joe Celko在他的书“ Smarties中的SQL中的树和层次结构”中所述。我的客户要求一种对树的一级进行排序的方法,也就是对一个特定父级的子级进行重新排序。在乔的书中,他在4.8.1节中讨论了“移动子树”。这几乎是我想要做的,但是要大量进行。

我的思考过程是这样做的:

  1. 创建一个临时表以容纳父级的所有后代
  2. 以新的顺序将后代复制到临时表中(子代更改顺序,但子代保持原来的顺序)
  3. 一旦所有子代和后代都复制到临时表中,请将其从源中删除,并将它们从临时表中复制到源中。

虽然它不是微不足道的,但我认为它会起作用。唯一的其他小问题是我在SQLite中工作,而我没有存储proc。我不介意分三步或四步执行这些操作,我试图弄清楚的是,是否有一种方法可以使用一个insert命令加载临时表。首先,我将仅通过“名称”进行排序。在乔的书中,他建议创建一个视图以显示下属。我有这样的看法,以便该查询可以按顺序给我父母的孩子:

select ChildOID, ChildName, lft, rgt
from NodeSubordinates
where ParentOID = '98f13b01-3936-44b0-84a4-56681320fb7d' and 
      ChildOID <> '98f13b01-3936-44b0-84a4-56681320fb7d'
order by ChildName

问题是:如何使用它来控制加载带有结果的临时表?我还需要调整lft / rgt的值,但这很容易。真正的问题是将ParentOID的所有后代节点放入临时表中。

0 个答案:

没有答案