sqlserver数据库,想想把树形表用sql写出来

image.pngimage.pngimage.png

FineReport 超级无敌小熊蛋 发布于 2025-7-10 14:50 (编辑于 2025-7-10 14:57)
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共3回答
最佳回答
0
华莉星宸Lv7专家互助
发布于2025-7-10 14:55

你想咋展示?

你这就是一个树的后台存储啊

  • 超级无敌小熊蛋 超级无敌小熊蛋(提问者) 就是展示成和树数据集一样,但是我需要sql
    2025-07-10 14:57 
  • 华莉星宸 华莉星宸 回复 超级无敌小熊蛋(提问者) 你是想把每一层都显示出来
    比如省 市 区县 镇这样的?
    2025-07-10 15:07 
  • 超级无敌小熊蛋 超级无敌小熊蛋(提问者) 回复 华莉星宸 嗯嗯
    2025-07-10 15:10 
  • 华莉星宸 华莉星宸 回复 超级无敌小熊蛋(提问者) 大概思路
    select a.fullname, b.fullname as twoname, c.fullname as three
    from tab a
    left join tab b
    on a.typeid = b.parid
    left join tab c
    on b.typeid = c.parid
    2025-07-10 15:11 
  • 超级无敌小熊蛋 超级无敌小熊蛋(提问者) 回复 华莉星宸 知道了自连接去构树,我去试试吧
    2025-07-10 15:20 
最佳回答
0
用户k6280494Lv6专家互助
发布于2025-7-10 14:57

-- 方案1:邻接表模型

CREATE TABLE TreeAdjacency (

    NodeID INT PRIMARY KEY,

    NodeName NVARCHAR(50) NOT NULL,

    ParentID INT NULL,

    FOREIGN KEY (ParentID) REFERENCES TreeAdjacency(NodeID)

);

-- 插入示例数据

INSERT INTO TreeAdjacency VALUES (1, '根节点', NULL);

INSERT INTO TreeAdjacency VALUES (2, '子节点1', 1);

INSERT INTO TreeAdjacency VALUES (3, '子节点2', 1);

INSERT INTO TreeAdjacency VALUES (4, '子节点1.1', 2);

-- 方案2:路径枚举模型

CREATE TABLE TreePath (

    NodeID INT PRIMARY KEY,

    NodeName NVARCHAR(50) NOT NULL,

    Path NVARCHAR(MAX) NOT NULL -- 存储如'/1/2/4'这样的路径

);

-- 插入示例数据

INSERT INTO TreePath VALUES (1, '根节点', '/1');

INSERT INTO TreePath VALUES (2, '子节点1', '/1/2');

INSERT INTO TreePath VALUES (3, '子节点2', '/1/3');

INSERT INTO TreePath VALUES (4, '子节点1.1', '/1/2/4');

-- 查询所有子节点的递归CTE示例(邻接表)

WITH TreeCTE AS (

    SELECT * FROM TreeAdjacency WHERE NodeID = 1 -- 从根节点开始

    UNION ALL

    SELECT t.* FROM TreeAdjacency t

    JOIN TreeCTE c ON t.ParentID = c.NodeID

)

SELECT * FROM TreeCTE;

最佳回答
0
云波Lv2见习互助
发布于2025-7-10 15:04

with rs1 as(

SELECT * FROM 表名

where typeid = '00000'

),

rs2 as(

SELECT * FROM 表名

where typeid in (

select parid from rs1)

),

rs3 as(

SELECT * FROM 表名

where typeid in (

select parid from rs2)

)

select * from (

select * from rs3

union all

select * from rs2

union all

select * from rs1

)t1

GROUP BY typeid

ORDER BY parid

  • 4关注人数
  • 54浏览人数
  • 最后回答于:2025-7-10 15:04
    请选择关闭问题的原因
    确定 取消
    返回顶部