Pages

Hàm trả về các nút gốc trong cấu trúc cây hierarchyid

-- Hàm trả về các nút gốc trong cấu trúc cây hierarchyid --
-- by code4viet --
-- Do chúng ta dùng cấu cấu hierarchyid nên sẽ
-- không lưu trường ParentID theo cấu trúc cây truyền thống --
-- Theo cấu trúc cây truyền thống chúng ta muốn tìm nút gốc thường điều kiện sẽ là ParentID is null --
-- Còn theo cấu trúc cây hierarchyid muốn tìm nút gốc phải dùng hàm hierarchyid::GetRoot()
-- với điều kiện là OrgNode=hierarchyid::GetRoot()

declare @code4viet_newchildren  table
(
    ID int,
    ParentID int,
    Num int,
    OrgNode hierarchyid,
    LogicalNode nvarchar(max)
);

declare @code4viet_children  table
   (
    ID int,
    ParentID int,
    Num int  
);

-- dữ liệu mẫu --

INSERT @code4viet_children
    (ID, ParentID, Num)
    select 1, NULL , 1
union all
    select 2, 1, 1
union all
    select 16, 1, 2
union all
    select 25, 1, 3
union all
    select 234, 1, 4
union all
    select 263, 1, 5
union all
    select 273, 1, 6
union all
    select 3, 2, 1
union all
    select 4, 3, 1
union all
    select 5, 3, 2
union all
    select 6, 3, 3
union all
    select 7, 3, 4
union all
    select 300, NULL , 1
union all
    select 301, 300, 1
;


-- kiểm tra dữ liệu mẫu --
-- select * from @code4viet_children;
-- tạo dữ liệu theo cấu trúc mới --

WITH
    paths(path, ID)
    AS
    (
        -- Lấy giá trị nút gốc
                    SELECT hierarchyid::GetRoot() AS OrgNode, ID
            FROM @code4viet_children AS C
            WHERE ParentID IS NULL
        UNION ALL
            -- Phần này cung cấp các giá trị cho tất cả các nút ngoại trừ nút gốc
            SELECT
                CAST(p.path.ToString() + CAST(C.Num AS varchar(30)) + '/' AS hierarchyid),
                C.ID
            FROM @code4viet_children AS C
                JOIN paths AS p
                ON C.ParentID = P.ID
    )
-- điền dữ liệu mới vào bảng --
insert into @code4viet_newchildren
    (OrgNode,LogicalNode,ID,ParentID,Num)
select a.[path], a.[path].ToString() AS LogicalNode, ID=a.ID, b.ParentID, b.Num
from paths a inner join @code4viet_children b on a.ID=b.ID;

-- kiểm tra dữ liệu --
select N'-- dữ liệu đầy đủ --'
select *
from @code4viet_newchildren
order by LogicalNode

-- Các hàm trong cấu trúc hierarchyid --
/*
hierarchyid::GetRoot()  
node.GetLevel()  
*/

select N'-- chỉ lấy dữ liệu là nút gốc --'
-- chỉ lấy dữ liệu là nút gốc --
select *
from @code4viet_newchildren
WHERE OrgNode = hierarchyid::GetRoot()
order by LogicalNode

Không có nhận xét nào :

Đăng nhận xét