22,207
社区成员
发帖
与我相关
我的任务
分享
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[up_id] int,[name] int,[level] int)
Insert #T
select 1,0,1,1 union all
select 2,0,2,1 union all
select 3,1,3,2 union all
select 4,2,4,2 union all
select 5,3,5,3 union all
select 6,3,6,3 union all
select 7,2,7,2 union all
select 8,4,8,3 union all
select 9,3,9,3
Go
select A.ID,
A.name as level3_name,
case when A.level=2 then A.name else ISNULL(B.name,A.name) end as level2_name,
COALESCE(C.NAME,B.NAME,A.NAME) as level3_name
from #T A
outer apply (select * from #T where A.up_id=id) as B
outer apply (select name,id from #T where B.up_id=id) as C
where A.level=指定级别
if not object_id(N'Tab') is null
drop table Tab
Go
Create table Tab([id] int,[up_id] int,[name] int,[level] int)
Insert Tab
select 1,0,1,1 union all
select 2,1,2,2 union all
select 3,1,3,2 union all
select 4,2,4,3 union all
select 5,3,5,3 union all
select 6,3,6,3 union all
select 7,2,7,3 union all
select 8,2,8,3 union all
select 9,3,9,3
--测试数据结束
CREATE VIEW tree_view AS
SELECT a.id,
a.name AS level_3_name,
b.level_2_name,
b.level_1_name
FROM Tab a
INNER JOIN (
SELECT a.name AS [level_1_name],
b.name AS [level_2_name]
FROM Tab A
INNER JOIN Tab b
ON a.name = b.up_id
WHERE a.[level] = 1
) b
ON a.up_id = b.level_2_name
SELECT * FROM Tree_view
id level_3_name level_2_name level_1_name
----------- ------------ ------------ ------------
4 4 2 1
5 5 3 1
6 6 3 1
7 7 2 1
8 8 2 1
9 9 3 1
--测试数据
if not object_id(N'Tempdb..#tableA') is null
drop table #tableA
Go
Create table #tableA([id] int,[up_id] int,[name] int,[level] int)
Insert #tableA
select 1,0,1,1 union all
select 2,1,2,2 union all
select 3,1,3,2 union all
select 4,2,4,3 union all
select 5,3,5,3 union all
select 6,3,6,3 union all
select 7,2,7,3 union all
select 8,2,8,3 union all
select 9,3,9,3
Go
--测试数据结束
;WITH ctea AS (
SELECT id,name,up_id
FROM #tableA
WHERE id NOT IN ( SELECT up_id
FROM #tableA )
)
SELECT ctea.id ,
ctea.name AS level_3_name ,
a.name AS level_2_name ,
b.name AS level_3_name
FROM ctea
JOIN #tableA a ON ctea.up_id = a.id
JOIN #tableA b ON a.up_id = b.id