急求一个SQL过程的编写
需要将一个表转成另一个表,由1条记录转成多条记录,很不好做,请大家帮助,谢谢!A表:(申请表)
申请编号 人员名称 (注:人员中的分隔符为操作员手工录入,可能为,、;等各种可能的符号)
00001 张三,李四、王五
......B表:(人员参数表)
人员编号 名称
01 张三
02 李四现在要根据上面的2个表,求出:C表:(输出表)
申请编号 人员编号 人员名称
00001 01 张三
00001 02 李四
00001 王五 (由于在人员参数表中找不到对应的名称,就将名称直接写在人员编号中)
需要将一个表转成另一个表,由1条记录转成多条记录,很不好做,请大家帮助,谢谢!A表:(申请表)
申请编号 人员名称 (注:人员中的分隔符为操作员手工录入,可能为,、;等各种可能的符号)
00001 张三,李四、王五
......B表:(人员参数表)
人员编号 名称
01 张三
02 李四现在要根据上面的2个表,求出:C表:(输出表)
申请编号 人员编号 人员名称
00001 01 张三
00001 02 李四
00001 王五 (由于在人员参数表中找不到对应的名称,就将名称直接写在人员编号中)
drop table a
go
create table a (申请编号 varchar(10) , 人员名称 varchar(100))
insert a select
'00001' ,'张三,李四,王五'
go
if OBJECT_ID('b') is not null
drop table b
go
create table b (人员编号 varchar(10) , 名称 varchar(10))
insert b select
'01', '张三' union select
'02', '李四'
go
select 申请编号,
人员编号=ISNULL(人员编号,name),
人员名称=ISNULL(人员编号,'')
from (
select 申请编号,
SUBSTRING(a.人员名称,number,CHARINDEX(',',a.人员名称+',',number)-number) as name
from a join master..spt_values s
on s.number between 1 and LEN(a.人员名称)
where type='p' and SUBSTRING(','+a.人员名称,number,1)=',') k left join b on k.name=b.名称
/*
申请编号 人员编号 人员名称
---------- ---------- ----------
00001 01 01
00001 02 02
00001 王五 */
还写错了。。
select 申请编号,
人员编号=ISNULL(人员编号,name),
人员名称=case when 人员编号 IS null then '' else name end
from (
select 申请编号,
SUBSTRING(a.人员名称,number,CHARINDEX(',',a.人员名称+',',number)-number) as name
from a join master..spt_values s
on s.number between 1 and LEN(a.人员名称)
where type='p' and SUBSTRING(','+a.人员名称,number,1)=',') k left join b on k.name=b.名称
但是,由于字符串并没有明确的分隔符,甚至根本就没有分隔符,所以,还是不能达到功能要求。
这种不规范的写法确实很难拆分,我能想到的只有使用逐个字符串组合分别与人员表进行比较,先比较长字符,再比较短字符,找到了,就执行insert,最后没有找到的剩余字符,就插入到最后。