sqlserver implements tree structure recursive query (infinite classification)

A common table expression (CTE), is a temporary named result set defined in a query that will be used in the from clause. Each CTE is defined only once (but can be referenced any number of times within its scope) and will live for the lifetime of that query. CTEs can be used to perform recursive operations. The syntax to create is:
with <name of you cte>(<column names>)
as(
<actual query>
)
select * from <name of your cte>
 
Generate data
 
--Menu directory structure table
create table tb_menu(
 id int not null, --主键id
title varchar(50), --title
 parent int --parent id
);
--parent menu
insert into tb_menu(id, title, parent) values(1, 'parent menu 1',null);
insert into tb_menu(id, title, parent) values(2, 'parent menu 2',null);
insert into tb_menu(id, title, parent) values(3, 'parent menu 3',null);
insert into tb_menu(id, title, parent) values(4, 'parent menu 4',null);
insert into tb_menu(id, title, parent) values(5, 'parent menu 5',null);
--A menu
insert into tb_menu(id, title, parent) values(6, 'first level menu 6',1);
insert into tb_menu(id, title, parent) values(7, 'first level menu 7',1);
insert into tb_menu(id, title, parent) values(8, 'first level menu 8',1);
insert into tb_menu(id, title, parent) values(9, 'first-level menu 9',2);
insert into tb_menu(id, title, parent) values(10, 'first-level menu 10',2);
insert into tb_menu(id, title, parent) values(11, 'first-level menu 11',2);
insert into tb_menu(id, title, parent) values(12, 'first-level menu 12',3);
insert into tb_menu(id, title, parent) values(13, 'First-level menu 13',3);
insert into tb_menu(id, title, parent) values(14, 'First-level menu 14',3);
insert into tb_menu(id, title, parent) values(15, 'First-level menu 15',4);
insert into tb_menu(id, title, parent) values(16, 'First-level menu 16',4);
insert into tb_menu(id, title, parent) values(17, 'First-level menu 17',4);
insert into tb_menu(id, title, parent) values(18, 'First-level menu 18',5);
insert into tb_menu(id, title, parent) values(19, 'first-level menu 19',5);
insert into tb_menu(id, title, parent) values(20, 'First-level menu 20',5);
--Secondary menu
insert into tb_menu(id, title, parent) values(21, 'Secondary menu 21',6);
insert into tb_menu(id, title, parent) values(22, 'Secondary menu 22',6);
insert into tb_menu(id, title, parent) values(23, 'Secondary menu 23',7);
insert into tb_menu(id, title, parent) values(24, 'Secondary menu 24',7);
insert into tb_menu(id, title, parent) values(25, 'Secondary menu 25',8);
insert into tb_menu(id, title, parent) values(26, 'Secondary menu 26',9);
insert into tb_menu(id, title, parent) values(27, 'Secondary menu 27',10);
insert into tb_menu(id, title, parent) values(28, 'Secondary menu 28',11);
insert into tb_menu(id, title, parent) values(29, 'Secondary menu 29',12);
insert into tb_menu(id, title, parent) values(30, 'Secondary menu 30',13);
insert into tb_menu(id, title, parent) values(31, 'Secondary menu 31',14);
insert into tb_menu(id, title, parent) values(32, 'Secondary menu 32',15);
insert into tb_menu(id, title, parent) values(33, 'Secondary menu 33',16);
insert into tb_menu(id, title, parent) values(34, 'Secondary menu 34',17);
insert into tb_menu(id, title, parent) values(35, 'Secondary menu 35',18);
insert into tb_menu(id, title, parent) values(36, 'Secondary menu 36',19);
insert into tb_menu(id, title, parent) values(37, 'Secondary menu 37',20);
 
--Third level menu
insert into tb_menu(id, title, parent) values(38, 'three-level menu 38',21);
insert into tb_menu(id, title, parent) values(39, 'three-level menu 39',22);
insert into tb_menu(id, title, parent) values(40, 'Level 3 menu 40',23);
insert into tb_menu(id, title, parent) values(41, 'Level 3 menu 41',24);
insert into tb_menu(id, title, parent) values(42, 'third-level menu 42',25);
insert into tb_menu(id, title, parent) values(43, 'Level 3 menu 43',26);
insert into tb_menu(id, title, parent) values(44, 'Level 3 menu 44',27);
insert into tb_menu(id, title, parent) values(45, 'Level 3 menu 45',28);
insert into tb_menu(id, title, parent) values(46, 'third-level menu 46',28);
insert into tb_menu(id, title, parent) values(47, 'three-level menu 47',29);
insert into tb_menu(id, title, parent) values(48, 'third-level menu 48',30);
insert into tb_menu(id, title, parent) values(49, 'third-level menu 49',31);
insert into tb_menu(id, title, parent) values(50, 'third-level menu 50',31);
commit;
 
2. Find all superior nodes
--Query all the root nodes of the superior of a node (44) in the tree structure
with cte_parent(id,title,parent)
as
(
    --initial condition
    select id,title,parent
    from tb_menu
    where id = 44 -- list sub-node query conditions
    union all
    -- recursive condition
    select a.id,a.title,a.parent
    from tb_menu a
    inner join 
    cte_parent b -- perform recursion, here is the understanding 
    on a.id=b.parent  
)                       
select * from cte_parent;
 
3. Find the subordinate node with level
 --Query all child nodes under a node in the tree structure (
with cte_child(id,title,parent,level)
as
(
    --initial condition
    select id,title,parent,0 as level
    from tb_menu
    where id = 6--list parent node query conditions
    union all
    -- recursive condition
    select a.id,a.title,a.parent,b.level+1
    from tb_menu a
    inner join 
    cte_child b
    on ( a.parent=b.id)   
)
select  * from cte_child;

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326896588&siteId=291194637