根据 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 = ''
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
完成。
根据 WBS 列新 PID 数据的更多相关文章
- SQLite数据库中获取新插入数据的自增长ID
SQLite数据库中有一有列名为ID的自增列,项目需求要在向数据库在插入新数据的同时返回新插入数据行的ID. 我这里用事务,把插入和查询语句通过ExecuteReader一起提交,返回DbDataRe ...
- DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样
'近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考. ...
- SQL 如何在自增列插入指定数据
SQL Server 中数据表往往会设置自增列,常见的比如说 首列的ID列. 往数据表插入新数据的时候,自增列是跳过的,无需插入即会按照设置的自增规则进行列增长.那么,如果我们想往自增列插入我们指定 ...
- SQLServer 自增主键创建, 指定自增主键列值插入数据,插入主键
http://blog.csdn.net/zh2qiang/article/details/5323981 SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入. 1 ...
- hive中同列多行数据组合的方法以及array to string要点(行转列)
1. 同列多行数据组合成一个字段cell的方法, top N 问题的hive方案 如下: hive 列转行 to json与to array list set等复杂结构,hive topN的提取的窗口 ...
- 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?
在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...
- 使用LKDBHelper 插入相同id时候应该是更新数据而不是插入新的数据
要实现使用LKDBHelp 插入相同id时候应该是更新数据而不是插入新的数据 例如#import "JSONModel.h" @interface InfoModel : JSON ...
- WordPress插件制作教程(五): 创建新的数据表
上一篇讲解了怎样将数据保存到数据库,今天为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来.原理很简单,激活插件的时候运行创建数据库的代码.看下面代码: & ...
- oracle_删除同一列的重复数据
<!--删除同一列的重复数据 rowid 在orcle中 数据的物理地址---> delete from tbl_over_picture_alarm a where rowid not ...
随机推荐
- virtualbox+vagrant学习-2(command cli)-18-vagrant ssh-config命令
SSH Config 格式: vagrant ssh-config [options] [name|id] 这将从SSH直接将SSH配置文件的有效配置输出到正在运行的vagrant 计算机(而不是使用 ...
- pl/sql连接远程oracle
1.找到oracle安装程序下的网络配置助手 2.选中本地net服务,进行添加 3.输入远程oracle服务名 4.选中tcp协议 5.输入远程oracle的ip地址 6.在网络服务名处,随便输入一个 ...
- 文件操作示例脚本 tcl
linux 下,经常会对用到文件操作,下面是一个用 tcl 写的文件操作示例脚本: 其中 set f01 [open "fix.tcl" w] 命令表示 打开或者新建一个文件“fi ...
- Jenkins+github的一次定时构建示例
首先说明,我的电脑环境是windows,所以以下的示例是基于windows10 X64. 一.新建任务,填写名称,选择类型,点击左下角的[确定] 二.配置 1.General 2.源码管理 之前在gi ...
- Linux 查看网卡流量的几个方法
1. sar -n DEV 1 2 (命令后面1 2 意思是:每一秒钟取1次值,取2次.) 2. cat /proc/net/dev 3. iftop 4. ifstat 5. nload 6. ...
- 【jq】JQuery对select的操作
下拉框 <select id="selectID" name="selectName"> <option vlaue="1" ...
- Cannot obtain block length for LocatedBlock故障分析和解决
来源:CSDN 作者:Syn良子 原文:https://blog.csdn.net/cssdongl/article/details/77750495 一.问题背景 问题产生的原因可能是由于前几日H ...
- springboot-web进阶(二)——AOP统一处理请求
一.AOP使用示例 AOP的概述在spring篇已经存在,这里不再赘述 1.准备 引入依赖 <dependency> <groupId>org.springframework. ...
- JavaWeb基础—Servlet
一.Servlet是什么 是服务器上运行的Java小应用程序,并被称为JavaWeb三大组件之一 通常我们把实现了Servlet的类,称之为Servlet Servlet作用主要是 1.接收请求数据 ...
- 04 - django的路由层 1
1.路由控制简单配置 from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003 ...