根据 WBS 列新 PID 数据
之前写过关于 菜单树的。 http://www.cnblogs.com/newsea/archive/2012/08/01/2618731.html
现在在写城市树。
结构:
CREATE TABLE [dbo].[S_City]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NULL, [PID] [int] NULL, [Wbs] [varchar](50) NULL, [Code] [varchar](50) NULL, [SortID] [float] NULL, [IsValidate] [bit] NULL, CONSTRAINT [PK_City] PRIMARY KEY CLUSTERED ( [ID] ASC ) ON [PRIMARY] ) ON [PRIMARY]
用 Excel 导入了数据。 数据是顺序树型的。 PID 是空的, Wbs 是正确的。顺序树的Wbs为: 1 , 1.1 , 1.2 , 2 , 2.1 , 2.2 ,2.2.1 ,3 ,3.1 。。。。
需要做的工作:
1. 更新正确的 PID 。
2. 把WBS 更新为 伪WBS, 伪WBS 是 PWbs + "," + PID , 根节点的 WBS = PID
操作过程
用一个基础SQL,得到 父PWbs,Level:
select *, SUBSTRING(wbs,1, LEN(wbs) - charindex('.', REVERSE( wbs) ) ) PWbs, LEN(wbs)- len(REPLACE(wbs,'.','')) as [Level] from dbo.S_City where LEN(wbs)- len(REPLACE(wbs,'.','')) = 1
再逐级更新PID
--第一步,更新根 update S_City set pid = 0 where LEN(wbs)- len(REPLACE(wbs,'.','')) = 0 --第二步,更新二级: update c set c.pid = p.id from S_City as c ,S_City as p where SUBSTRING(c.wbs,1, LEN(c.wbs) - charindex('.', REVERSE( c.wbs) ) ) = p.Wbs and LEN(c.wbs)- len(REPLACE(c.wbs,'.','')) = 1 --第三步,更新第三级 update c set c.pid = p.id from S_City as c ,S_City as p where SUBSTRING(c.wbs,1, LEN(c.wbs) - charindex('.', REVERSE( c.wbs) ) ) = p.Wbs and LEN(c.wbs)- len(REPLACE(c.wbs,'.','')) = 2
验证一下树:
with p as ( select * from S_City where Pid = 0 union all select t.* from S_City as t join p on ( t.PID = p.ID) ) select * from p
再更新 Wbs
--第一步,更新根 update S_City set Wbs = '0' where pid = 0 --第二步,更新二级: update c set c.Wbs = p.Wbs +',' + cast(p.id as varchar(30)) from S_City as c ,S_City as p where c.pid = p.ID and p.PID = 0 --第三步,更新第三级 update c set c.Wbs = p.Wbs +',' + cast(p.id as varchar(30)) from S_City as c ,S_City as p ,S_City as pp where c.pid = p.ID and p.pid = pp.ID and pp.PID = 0
完成。
![]() |
作者:NewSea 出处:http://newsea.cnblogs.com/
QQ,MSN:iamnewsea@hotmail.com 如无特别标记说明,均为NewSea原创,版权私有,翻载必纠。欢迎交流,转载,但要在页面明显位置给出原文连接。谢谢。 |
分类:
Db,SQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端