数据库有列值为如下所示pid name groupNo group_path
11 张三 A0001 d:\学生文档\A0001\11\
12 李四 A0001 d:\学生文档\A0001\12\
13 王五 A0002 d:\学生文档\A0002\13\
14 赵六 B0001 d:\学生文档\B0001\14\
15 小明 B0002 d:\学生文档\B0002\15\
16 aaaa B0003 d:\学生文档\B0003\16\
17 abab B0003 d:\学生文档\B0003\17\
18 bbbb T0001 d:\学生文档\T0001\18\
----------------------------------------------------------------------------
要改成:pid name groupNo group_path
11 张三 00001 d:\学生文档\00001\11\
12 李四 00001 d:\学生文档\00001\12\
13 王五 00002 d:\学生文档\00002\13\
14 赵六 00003 d:\学生文档\00003\14\
15 小明 00004 d:\学生文档\00004\15\
16 aaaa 00005 d:\学生文档\00005\16\
17 abab 00005 d:\学生文档\00005\17\
18 bbbb 00006 d:\学生文档\00006\18\--------------------------------------------------------------------------------------
pid 为主键, group_path的值为 'd:\学生文档\' + groupNo + pid 要求:
groupNo前面的字母全部去掉,按照A-Z的字母排序以00001,00002,00003....的顺序重新命名一直往下面排
从B的开始为A的最大组号+1,如果A最大为A0043,B的第一盘应该改为00044....
同时后面的group_path中的 groupNo 也要改成相应的组号
请问这句 SQL怎么写?
11 张三 A0001 d:\学生文档\A0001\11\
12 李四 A0001 d:\学生文档\A0001\12\
13 王五 A0002 d:\学生文档\A0002\13\
14 赵六 B0001 d:\学生文档\B0001\14\
15 小明 B0002 d:\学生文档\B0002\15\
16 aaaa B0003 d:\学生文档\B0003\16\
17 abab B0003 d:\学生文档\B0003\17\
18 bbbb T0001 d:\学生文档\T0001\18\
----------------------------------------------------------------------------
要改成:pid name groupNo group_path
11 张三 00001 d:\学生文档\00001\11\
12 李四 00001 d:\学生文档\00001\12\
13 王五 00002 d:\学生文档\00002\13\
14 赵六 00003 d:\学生文档\00003\14\
15 小明 00004 d:\学生文档\00004\15\
16 aaaa 00005 d:\学生文档\00005\16\
17 abab 00005 d:\学生文档\00005\17\
18 bbbb 00006 d:\学生文档\00006\18\--------------------------------------------------------------------------------------
pid 为主键, group_path的值为 'd:\学生文档\' + groupNo + pid 要求:
groupNo前面的字母全部去掉,按照A-Z的字母排序以00001,00002,00003....的顺序重新命名一直往下面排
从B的开始为A的最大组号+1,如果A最大为A0043,B的第一盘应该改为00044....
同时后面的group_path中的 groupNo 也要改成相应的组号
请问这句 SQL怎么写?
-- Author :fredrickhu(小F,向高手学习)
-- Date :2011-05-12 13:21:43
-- Verstion:
-- Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([pid] int,[name] varchar(4),[groupNo] varchar(5),[group_path] varchar(20))
insert [tb]
select 11,'张三','A0001','d:\学生文档\A0001\11' union all
select 12,'李四','A0001','d:\学生文档\A0001\12' union all
select 13,'王五','A0002','d:\学生文档\A0002\13' union all
select 14,'赵六','B0001','d:\学生文档\B0001\14' union all
select 15,'小明','B0002','d:\学生文档\B0002\15' union all
select 16,'aaaa','B0003','d:\学生文档\B0003\16' union all
select 17,'abab','B0003','d:\学生文档\B0003\17' union all
select 18,'bbbb','T0001','d:\学生文档\T0001\18'
--------------开始查询--------------------------
--select parsename(REPLACE(group_path,'\','.'),2) from tb
update
tb
set
groupNo=RIGHT(groupNo,len(groupNo)-1),
group_path=parsename(REPLACE(group_path,'\','.'),4)+'\'+parsename(REPLACE(group_path,'\','.'),3)+'\'+REPLACE(parsename(REPLACE(group_path,'\','.'),2),left(parsename(REPLACE(group_path,'\','.'),2),1),'')+'\'+parsename(REPLACE(group_path,'\','.'),1)select * from tb
----------------结果----------------------------
/* (8 行受影响)(8 行受影响)
pid name groupNo group_path
----------- ---- ------- --------------------
11 张三 0001 d:\学生文档\0001\11
12 李四 0001 d:\学生文档\0001\12
13 王五 0002 d:\学生文档\0002\13
14 赵六 0001 d:\学生文档\0001\14
15 小明 0002 d:\学生文档\0002\15
16 aaaa 0003 d:\学生文档\0003\16
17 abab 0003 d:\学生文档\0003\17
18 bbbb 0001 d:\学生文档\0001\18(8 行受影响)
*/
不对噢。.13 王五 0002 d:\学生文档\0002\13
这条应该是00003了。..不是只单单把前面的字母去掉,我还要按组号不同,重新用00001,000002命名.
看见了 更新的时候分下组就可以了 2005可以用ROW_NUMBER()OVER2000可以用IDENTITY
select right('0000'+cast(DENSE_RANK() over(order by groupno) as varchar(5)),5) as groupno from tb