部门表转换 求一sql实现

naner_china 2008-08-20 11:16:54
部门代码(id) 部门名称(desp)
01 A
0101 A1
010101 A11
010102 A12
0102 A2
010201 A21
010202 A22
02 B
0201 B1
0202 B2
... ...

现在想把上面表的数据转换成如下: 用简单通用的sql语句什么实现
部门代码(id) 部门名称(desp) 部门父代码(pid)
01 A
0101 A1 01
010101 A11 0101
010102 A12 0101
0102 A2 01
010201 A21 0102
010202 A22 0102
02 B
0201 B1 02
0202 B2 02
... ...
...全文
155 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
naner_china 2008-08-20
  • 打赏
  • 举报
回复
谢谢各位达人
  • 打赏
  • 举报
回复

select id,desp,p_id=(select max(id) from tb where a.id<>id and a.id like id+'%')
from tb a

01 A NULL
0101 A1 01
010101 A11 0101
010102 A12 0101
0102 A2 01
010201 A21 0102
010202 A22 0102
02 B NULL
0201 B1 02
0202 B2 02

arrow_gx 2008-08-20
  • 打赏
  • 举报
回复
select id,desp,left(id,(len(desp)-1)*2) as pid from tb1
wgzaaa 2008-08-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kelph 的回复:]
select id,desp,left(id,len(id)-2) from 表
[/Quote]
-狙击手- 2008-08-20
  • 打赏
  • 举报
回复
update ta
set pid = left(id,len(id) -2)
where len(id) > 2
中国风 2008-08-20
  • 打赏
  • 举报
回复
declare @T table([id] nvarchar(6),[desp] nvarchar(3))
Insert @T
select N'01',N'A' union all
select N'0101',N'A1' union all
select N'010101',N'A11' union all
select N'010102',N'A12' union all
select N'0102',N'A2' union all
select N'010201',N'A21' union all
select N'010202',N'A22' union all
select N'02',N'B' union all
select N'0201',N'B1' union all
select N'0202',N'B2'

Select
*,ParentID=(select isnull(max(ID),'') from @T where t.ID like [id]+'%' and ID<t.ID)
from
@T t


(10 個資料列受到影響)
id desp ParentID
------ ---- --------
01 A
0101 A1 01
010101 A11 0101
010102 A12 0101
0102 A2 01
010201 A21 0102
010202 A22 0102
02 B
0201 B1 02
0202 B2 02

(10 個資料列受到影響)

jia_guijun 2008-08-20
  • 打赏
  • 举报
回复
update TBName set PID=isnull(select ID from TBName a where left(TBName.ID,len(TBName.ID)-2)=a.id),'')


请自行测试。
kelph 2008-08-20
  • 打赏
  • 举报
回复
select id,desp,left(id,len(id)-2) from 表

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧