急求一个SQL过程的编写,求助!

quanjishou 2010-02-23 10:31:35
急求一个SQL过程的编写
需要将一个表转成另一个表,由1条记录转成多条记录,很不好做,请大家帮助,谢谢!

A表:(申请表)
申请编号 人员名称 (注:人员中的分隔符为操作员手工录入,可能为,、;等各种可能的符号)
00001 张三,李四、王五
......

B表:(人员参数表)
人员编号 名称
01 张三
02 李四

现在要根据上面的2个表,求出:

C表:(输出表)
申请编号 人员编号 人员名称
00001 01 张三
00001 02 李四
00001 王五 (由于在人员参数表中找不到对应的名称,就将名称直接写在人员编号中)
...全文
199 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
quanjishou 2010-02-23
  • 打赏
  • 举报
回复
feixianxxx高手啊!
但是,由于字符串并没有明确的分隔符,甚至根本就没有分隔符,所以,还是不能达到功能要求。
这种不规范的写法确实很难拆分,我能想到的只有使用逐个字符串组合分别与人员表进行比较,先比较长字符,再比较短字符,找到了,就执行insert,最后没有找到的剩余字符,就插入到最后。
锦缕铱 2010-02-23
  • 打赏
  • 举报
回复
分隔符要是不统一,很难分的
qiqi860819 2010-02-23
  • 打赏
  • 举报
回复
最起码添加的时候,应该有个规范吧,分隔符都不能确定,真是让人……
东那个升 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 quanjishou 的回复:
就是这个拆分难。
由于是手工录入的,有可能是各种符号做为分隔符,也有可能是没有分隔符,就是张三李四连在一起录入的。
有可能是一个人,也有可能是多个人的名字。

抓狂。。。。。。名字连在一起。。。有智能分割的吗
feixianxxx 2010-02-23
  • 打赏
  • 举报
回复

还写错了。。
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.名称
feixianxxx 2010-02-23
  • 打赏
  • 举报
回复
写个规范的 就当练手

if OBJECT_ID('a') is not null
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 王五 */
quanjishou 2010-02-23
  • 打赏
  • 举报
回复
估计只能用游标逐条记录进行处理,逐个字符串与人员表中进行比较,从长字符到短字符比对下来,只能这样了。
quanjishou 2010-02-23
  • 打赏
  • 举报
回复
手工录入的文字,操作员什么人都有,因此什么情况都有。
SQL77 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 quanjishou 的回复:
就是这个拆分难。
由于是手工录入的,有可能是各种符号做为分隔符,也有可能是没有分隔符,就是张三李四连在一起录入的。
有可能是一个人,也有可能是多个人的名字。

额,这也能行?
SQL77 2010-02-23
  • 打赏
  • 举报
回复
(注:人员中的分隔符为操作员手工录入,可能为,、;等各种可能的符号)

全替换成一种可能不?

feixianxxx 2010-02-23
  • 打赏
  • 举报
回复
大哥 几个名字都连在一起的也有?
否则还可以将不是中文字的字符选出来改成统一的标点符号 然后在搞
百年树人 2010-02-23
  • 打赏
  • 举报
回复
如果没有同名或者相似名的,分隔符的问题可以用charindex来解决,关键是有些名字在B表没有
-狙击手- 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 quanjishou 的回复:
就是这个拆分难。
由于是手工录入的,有可能是各种符号做为分隔符,也有可能是没有分隔符,就是张三李四连在一起录入的。
有可能是一个人,也有可能是多个人的名字。


先找出规律来,否则。。。
快乐_石头 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 quanjishou 的回复:
就是这个拆分难。
由于是手工录入的,有可能是各种符号做为分隔符,也有可能是没有分隔符,就是张三李四连在一起录入的。
有可能是一个人,也有可能是多个人的名字。

那難了
~~~~
幫哭~~~
quanjishou 2010-02-23
  • 打赏
  • 举报
回复
就是这个拆分难。
由于是手工录入的,有可能是各种符号做为分隔符,也有可能是没有分隔符,就是张三李四连在一起录入的。
有可能是一个人,也有可能是多个人的名字。
dls349920923 2010-02-23
  • 打赏
  • 举报
回复
有点不太懂楼主的意思...
帮你up一下,
让高手来回答...
feixianxxx 2010-02-23
  • 打赏
  • 举报
回复
申请编号 人员名称 (注:人员中的分隔符为操作员手工录入,可能为,、;等各种可能的符号)
难。。
快乐_石头 2010-02-23
  • 打赏
  • 举报
回复
先將A表拆分
然後join
kittywrl 2010-02-23
  • 打赏
  • 举报
回复
程序之前不规范,所以造成,后续开发困难重重,希望先规范,比如: 当插入一个人的名字的时候就自动在名字后面加间隔符。
luoyoumou 2010-02-23
  • 打赏
  • 举报
回复
引用 4 楼 quanjishou 的回复:
就是这个拆分难。
由于是手工录入的,有可能是各种符号做为分隔符,也有可能是没有分隔符,就是张三李四连在一起录入的。
有可能是一个人,也有可能是多个人的名字。


-- 应用程序有问题,无法按你的要求实现,有可能、有可能
-- 没有规律。数据库不会知道到底是哪种可能!
加载更多回复(1)

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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