-- 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