在SQL 2008上使用层次结构数据类型。我的层次结构中的节点如下所示:
value node
36 /8/1/
38 /8/2/
34 /8/3/
40 /8/4/
42 /8/5/
44 /8/6/
46 /8/7/
48 /8/8/
我想重新排列节点,以便/ 8/3 /和/ 8/1 /切换位置。关于如何做到这一点的任何想法?
到目前为止,我只知道我在Array中的一个级别上加载所有节点,按照我希望的方式对它们进行排序,从表中删除它们并以排序的形式插入。
答案 0 :(得分:4)
如果(在您的示例中)您知道要提前操作的hierarchyid值,则可以直接执行,例如:
-- Place 1st node between 2nd and 3rd
UPDATE yourTable SET node = CAST('/8/2.5/' AS hierarchyid) WHERE value = 36;
-- Move 3rd node to 1st
UPDATE yourTable SET node = CAST('/8/1/' AS hierarchyid) WHERE value = 34;
如果您需要动态获取新的hierarchyid值,请查看GetDescendant()和GetAncestor()函数。使用它,该示例将如下所示:
DECLARE @Parent hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid
-- Grab hierarchyids from 2nd and 3rd node
SELECT @Child1 = node FROM yourTable WHERE value = 38;
SELECT @Child2 = node FROM yourTable WHERE value = 34;
-- Get the parent hierarchyid
SELECT @Parent = @Child1.GetAncestor(1);
-- Update 1st node to end up between 2nd and 3rd
UPDATE yourTable SET node = @Parent.GetDescendant(@Child1, @Child2) WHERE value = 36;
-- Update 3rd node to end up before 2nd
UPDATE yourTable SET node = @Parent.GetDescendant(NULL, @Child1) WHERE value = 34;
请注意,此示例中的hierarchyid不会保持不变。至少有一个人最终会使用'分数'作为其位置(例如'/8/2.5/'而不是'/ 8/3 /')。
答案 1 :(得分:0)