左右编码树的通用SQL语句

-- 查询树节点(带级别),按照前序遍历排序
SELECT  tree2.ResultID ,
        tree2.LeftID ,
        tree2.RightID ,
        tree2.ArgumentID ,
        tree2.FunID ,
        COUNT(*) layer
FROM    T_Trace_Geological tree1
        RIGHT JOIN T_Trace_Geological tree2 ON ( tree1.LeftID <= tree2.LeftID
                                                 AND tree1.RightID >= tree2.RightID
                                               )
GROUP BY tree2.ResultID ,
        tree2.LeftID ,
        tree2.RightID ,
        tree2.ArgumentID ,
        tree2.FunID
ORDER BY tree2.LeftID


-- 增加节点(其中3为上级节点ID,在3的节点上增加一个子节点)
UPDATE  T_Trace_Geological
SET     LeftID = LeftID + 2
WHERE   LeftID >= ( SELECT  RightID
                    FROM    T_Trace_Geological
                    WHERE   ResultID = 3
                  )


UPDATE  T_Trace_Geological
SET     RightID = RightID + 2
WHERE   RightID >= ( SELECT RightID
                     FROM   T_Trace_Geological
                     WHERE  ResultID = 3
                   )


INSERT  INTO T_Trace_Geological
        ( ResultID ,
          LeftID ,
          RightID ,
          ArgumentID ,
          FunID
        )
        SELECT  10 , --新增节点ID
                RightID - 2 ,
                RightID - 1 ,
                10 ,
                10
        FROM    T_Trace_Geological
        WHERE   ResultID = 3


-- 删除节点(其中10节点ID)
DELETE  tree1
FROM    T_Trace_Geological tree1
        INNER JOIN ( SELECT LeftID ,
                            RightID
                     FROM   T_Trace_Geological
                     WHERE  ResultID = 10
                   ) tree2 ON tree1.LeftID > tree2.LeftID
                              AND tree1.RightID < tree2.RightID




UPDATE  tree1
SET     tree1.LeftID = tree1.LeftID - ( tree2.RightID - tree2.LeftID + 1 )
FROM    T_Trace_Geological tree1
        INNER JOIN ( SELECT LeftID ,
                            RightID
                     FROM   T_Trace_Geological
                     WHERE  ResultID = 10
                   ) tree2 ON tree1.LeftID > tree2.LeftID
    
UPDATE  tree1
SET     tree1.RightID = tree1.RightID - ( tree2.RightID - tree2.LeftID + 1 )
FROM    T_Trace_Geological tree1
        INNER JOIN ( SELECT LeftID ,
                            RightID
                     FROM   T_Trace_Geological
                     WHERE  ResultID = 10
                   ) tree2 ON tree1.RightID > tree2.RightID 


DELETE  FROM T_Trace_Geological
WHERE   ResultID = 10 




--获得子树(2为子树的根)
SELECT  tree1.*
FROM    T_Trace_Geological tree1
        INNER JOIN ( SELECT LeftID ,
                            RightID
                     FROM   T_Trace_Geological
                     WHERE  ResultID = 2
                   ) tree2 ON tree1.LeftID >= tree2.LeftID
                              AND tree1.RightID <= tree2.RightID


--获得父节点路径(3当前节点)
SELECT  tree1.*
FROM    T_Trace_Geological tree1
        INNER JOIN ( SELECT LeftID ,
                            RightID
                     FROM   T_Trace_Geological
                     WHERE  ResultID = 3
                   ) tree2 ON tree1.LeftID < tree2.LeftID
                              AND tree1.RightID > tree2.RightID


---- sqlMap 执行多条sql示例
--<statement id="DeleteAccount" parameterClass="Account">
--    BEGIN DELETE FROM ORDERS WHERE ACCOUNT_ID = #Id#;
--    DELETE FROM ACCOUNTS WHERE ACCOUNT_ID = #Id#; END;
-- </statement>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值