zoukankan      html  css  js  c++  java
  • Hierarchyid(层次结构)数据类型

    实例表结构

    CREATE TABLE [dbo].[Emp](
        [ID] [int] IDENTITY(1,1),
        [Name] [varchar](50),
        [Org] [hierarchyid],
    )
    
    INSERT INTO Emp(Name,Org) VALUES('吴xx','/')
    INSERT INTO Emp(Name,Org) VALUES('谢xx','/1/')
    INSERT INTO Emp(Name,Org) VALUES('赵xx','/2/')
    INSERT INTO Emp(Name,Org) VALUES('卢xx','/1/1/')
    INSERT INTO Emp(Name,Org) VALUES('方xx','/1/2/')
    INSERT INTO Emp(Name,Org) VALUES('詹xx','/1/3/')
    INSERT INTO Emp(Name,Org) VALUES('沈xx','/2/1/')

    实例基础数据

    SELECT *,Org.ToString(),Org.GetLevel()
    FROM Emp

      

    hierarchyid方法

    ToString:节点路径

    --node.ToString()
    SELECT *,Org.ToString()
    FROM Emp

    GetLevel:节点深度

    --node.GetLevel()
    SELECT *,Org.GetLevel()
    FROM Emp
    
    SELECT *,Org.GetLevel()
    FROM Emp
    WHERE Org.GetLevel() = 1

     

    GetAncestor:节点N级祖先,即通过祖先节点反向获取指定级别的子节点。

    --child.GetAncestor(n)
    --指定节点的二级子节点
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
    SELECT * FROM Emp WHERE Org.GetAncestor(2) = @CurrentNode

    GetDescendant:节点子节点,大于child1且小于child2,child1/child2可为NULL。

    --parent.GetDescendant(child1,child2)
    --新增吴子节点,与谢/赵同级,但大于谢且小于赵。
    DECLARE @Child1 hierarchyid
    DECLARE @Child2 hierarchyid
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
    SELECT @Child1 = Org FROM Emp WHERE Name = '谢xx'
    SELECT @Child2 = Org FROM Emp WHERE Name = '赵xx'
    INSERT INTO Emp(Name,Org) VALUES('于xx',@CurrentNode.GetDescendant(@Child1,@Child2))

    IsDescendantOf:是否是节点的后代节点

    --child.IsDescendantOf(parent)
    --指定节点下的全部后代节点,包含本身
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '吴xx'
    SELECT * FROM Emp WHERE Org.IsDescendantOf(@CurrentNode) = 1

    GetReparentedValue:节点移动,节点路径从oldRoot指向newRoot

    --node.GetReparentedValue(oldRoot,newRoot)
    --于从指向吴子节点,更新指向赵子节点。
    DECLARE @OldRoot hierarchyid
    DECLARE @NewRoot hierarchyid
    SELECT @CurrentNode = Org FROM Emp WHERE Name = '于xx'
    SELECT @OldRoot = Org FROM Emp WHERE Name = '吴xx'
    SELECT @NewRoot = Org FROM Emp WHERE Name = '赵xx'
    UPDATE Emp SET Org=@CurrentNode.GetReparentedValue(@OldRoot,@NewRoot) WHERE Org = @CurrentNode

    GetRoot:根节点

    --hierarchyid::GetRoot()
    SELECT *
    FROM Emp
    WHERE Org = hierarchyid::GetRoot()

    Parse:从路径字符串转换为hierarchyid值,即编码。

    --hierarchyid::Parse()
    DECLARE @StringNode varchar(50)
    SET @StringNode = '/1/1/'
    SELECT *,Org.ToString() FROM Emp WHERE Org = hierarchyid::Parse(@StringNode)

     

  • 相关阅读:
    jieba分词
    hue审计记录-记录用户的查询记录(用户前端删除,后端也不会删除)
    nginx1.16.1平滑升级到1.18
    mysql5.7.24升级到5.7.30 rpm部署模式 redhat7
    ldap无法启动 system library:fopen:Permission denied bss_file.c:402
    hive练习-行列转换 窗口函数
    linkis重编译适配cdh
    redhat7 安装mysql5.15
    hive 自动加载分区 --动态分区
    最近搞了个客户端
  • 原文地址:https://www.cnblogs.com/zenple/p/4790058.html
Copyright © 2011-2022 走看看