Pages

Chuyển đổi cấu trúc cây dạng cha con sang cấu trúc dạng hierarchyid

 -- Chuyển đổi cấu trúc cây dạng cha con sang cấu trúc dạng hierarchyid --

-- by code4viet --

-- Nhằm nâng cao tìm kiếm cấu trúc cha con ta nên chuyển đổi cách lưu trữ truyền thống sang cấu trúc hierarchyid hiện đại để tận dụng các hàm tìm kiếm cấu trúc của SQL phiên bản mới --

-- code4viet_hierarchyid --



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

;


-- 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 * from @code4viet_newchildren order by LogicalNode 

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

Đăng nhận xét