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

 
复制代码


完成。

 

 

posted @   NewSea  阅读(440)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示