之前写过关于 菜单树的。 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 数据的更多相关文章

  1. SQLite数据库中获取新插入数据的自增长ID

    SQLite数据库中有一有列名为ID的自增列,项目需求要在向数据库在插入新数据的同时返回新插入数据行的ID. 我这里用事务,把插入和查询语句通过ExecuteReader一起提交,返回DbDataRe ...

  2. DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样

    '近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考. ...

  3. SQL 如何在自增列插入指定数据

    SQL Server  中数据表往往会设置自增列,常见的比如说 首列的ID列. 往数据表插入新数据的时候,自增列是跳过的,无需插入即会按照设置的自增规则进行列增长.那么,如果我们想往自增列插入我们指定 ...

  4. SQLServer 自增主键创建, 指定自增主键列值插入数据,插入主键

    http://blog.csdn.net/zh2qiang/article/details/5323981 SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入. 1 ...

  5. hive中同列多行数据组合的方法以及array to string要点(行转列)

    1. 同列多行数据组合成一个字段cell的方法, top N 问题的hive方案 如下: hive 列转行 to json与to array list set等复杂结构,hive topN的提取的窗口 ...

  6. 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?

    在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...

  7. 使用LKDBHelper 插入相同id时候应该是更新数据而不是插入新的数据

    要实现使用LKDBHelp 插入相同id时候应该是更新数据而不是插入新的数据 例如#import "JSONModel.h" @interface InfoModel : JSON ...

  8. WordPress插件制作教程(五): 创建新的数据表

    上一篇讲解了怎样将数据保存到数据库,今天为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来.原理很简单,激活插件的时候运行创建数据库的代码.看下面代码: & ...

  9. oracle_删除同一列的重复数据

    <!--删除同一列的重复数据 rowid 在orcle中 数据的物理地址---> delete from tbl_over_picture_alarm a where rowid not ...

随机推荐

  1. [luogu2680] 运输计划

    题面 ​ 很明显, 由于是求最长路的最小值, 我们可以使用二分求解. 我们二分一个长度\(mid\), 将所有使得\(dis(u, v)\)大于\(mid\)的点对\((u, v)\)找出, 设总共有 ...

  2. jdk8中tomcat修改配置PermSize为MetaspaceSize 标签: tomcatPermSizeMetaspaceSize

    JDK8中用metaspace代替permsize,因此在许多我们设置permsize大小的地方同样需要修改配置为metaspace 将-XX:PermSize=200m;-XX:MaxPermSiz ...

  3. JavaScript里的创建对象(一)

    一.序 面向对象有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.ECMA-262把对象定义为“无序属性的集合,其属性可以包含基本值.对象或者函数”. 使用Obje ...

  4. highchart本地化导出图片

    因为项目执行在内容,并且本身自带的功能是想highcharts  server写文件然后再下载的,所以 highchart本地化导出图片 就非常须要. 第一步改动export.js 里的URl 在在e ...

  5. Linux下onvif客户端获取ipc摄像头 GetServices:获取媒体地址(有的h265摄像头必须要这个接口)

    GetServices:获取媒体地址(有些h265的摄像头必须用到这个接口,得到获取能力时没获取到的另一个媒体地址) 鉴权:但是在使用这个接口之前是需要鉴权的.ONVIF协议规定,部分接口需要鉴权,部 ...

  6. 乘积尾零——第九届蓝桥杯C语言B组(省赛)第三题

    原创 标题:乘积尾零 如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7 ...

  7. JavaWeb基础—JDBC入门

    一.什么是JDBC JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成 二.JDBC原理概述 JDBC原理:其实就是一组规范(就是对类的规范 ...

  8. zookeeper入门实例

    package org.merit.test.zookeepertest; import java.io.IOException;import java.util.List;import java.u ...

  9. Noip前的大抱佛脚----字符串

    目录 字符串 经验 用FFT求解字符串匹配问题 两(多)串DP时状态合并 最长公共子序列转LIS 位运算最大值 挂链哈希 哈希处理回文串 树哈希 字符串模板库 KMP 最小循环表示 Mancher A ...

  10. Keil 中的Code,RO-data,RW-data,ZI-data

    我们开发项目中,编译.链接完成后,都要看一下RAM和Flash的利用情况,尤其在有bootloader的情况下,确保自己的单片机选型能符合项目的要求.其中ARM程序的组成,是很容易混淆的.此处所说的“ ...