救命啊!!!求一条SQL语句高手请帮忙!!!

chenguang79 2008-01-23 10:52:23
表1
id name Technical .....
01 张三 00001 .....
02 李四 00001 .....

表2 id name .....
00001 项目经理 .....
00002 法人代表 .....
00003 CTO .....
表1为用户表,表2为"数据字典"现在可以通过 LEFT 得到
SELECT a.id,a.name,b.fname as Technical FROM 表1 a left join 表2 b on a.Technical=b.id
id name Technical .....
01 张三 项目经理 .....
02 李四 法人代表 .....
可是现在出现了这样的问题:
表1
id name Technical .....
01 张三 00001,00002 .....
02 李四 00001,00002,00003 .....
怎么样得到
id name Technical .....
01 张三 项目经理,法人代表 .....
02 李四 项目经理,法人代表 ,CTO .....

身兼数职,用左联右连接就不行了,在用上面的SQL语句就不行了!!!
...全文
207 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
eyuannet 2008-03-07
  • 打赏
  • 举报
回复
mark
dawugui 2008-01-23
  • 打赏
  • 举报
回复
分解字符串包含的信息值后然后合并到另外一表的信息
(爱新觉罗.毓华 2007-12-23 广东深圳)

/*问题描述
tba
ID classid name
1 1,2,3 西服
2 2,3 中山装
3 1,3 名裤
tbb
id classname
1 衣服
2 上衣
3 裤子

我得的结果是
id classname name
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
*/

-----------------------------------------------------
--sql server 2000中的写法
create table tba(ID int,classid varchar(20),name varchar(10))
insert into tba values(1,'1,2,3','西服')
insert into tba values(2,'2,3' ,'中山装')
insert into tba values(3,'1,3' ,'名裤')
create table tbb(ID varchar(10), classname varchar(10))
insert into tbb values('1','衣服')
insert into tbb values('2','上衣')
insert into tbb values('3','裤子')
go

--第1种方法,创建函数来显示
create function f_hb(@id varchar(10))
returns varchar(1000)
as
begin
declare @str varchar(1000)
set @str=''
select @str=@str+','+[classname] from tbb where charindex(','+cast(id as varchar)+',',','+@id+',')>0
return stuff(@str,1,1,'')
end
go
select id,classid=dbo.f_hb(classid),name from tba
drop function f_hb
/*
id classid name
----------- ------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(所影响的行数为 3 行)
*/

--第2种方法.update
while(exists (select * from tba,tbb where charindex(tbb.id,tba.classid) >0))
update tba
set classid= replace(classid,tbb.id,tbb.classname)
from tbb
where charindex(tbb.id,tba.classid)>0
select * from tba
/*
ID classid name
----------- -------------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(所影响的行数为 3 行)
*/
drop table tba,tbb

------------------------------------------------------------------------
--sql server 2005中先分解tba中的classid,然后再合并classname
create table tba(ID int,classid varchar(20),name varchar(10))
insert into tba values(1,'1,2,3','西服')
insert into tba values(2,'2,3' ,'中山装')
insert into tba values(3,'1,3' ,'名裤')
create table tbb(ID varchar(10), classname varchar(10))
insert into tbb values('1','衣服')
insert into tbb values('2','上衣')
insert into tbb values('3','裤子')
go

SELECT id , classname , name FROM
(
SELECT DISTINCT id , name FROM (select tbc.id , tbc.name , tbb.classname from
(
SELECT A.id , A.name , B.classid FROM(SELECT id , name , [classid] = CONVERT(xml,'<root><v>' + REPLACE([classid], ',', '</v><v>') + '</v></root>') FROM tba)A
OUTER APPLY(SELECT classid = N.v.value('.', 'varchar(100)') FROM A.[classid].nodes('/root/v') N(v))B
) tbc , tbb where tbc.classid = tbb.id
) T
)A
OUTER APPLY
(
SELECT [classname]= STUFF(REPLACE(REPLACE((
SELECT classname FROM (select tbc.id , tbc.name , tbb.classname from
(
SELECT A.id , A.name , B.classid FROM(SELECT id , name , [classid] = CONVERT(xml,'<root><v>' + REPLACE([classid], ',', '</v><v>') + '</v></root>') FROM tba)A
OUTER APPLY(SELECT classid = N.v.value('.', 'varchar(100)') FROM A.[classid].nodes('/root/v') N(v))B
) tbc , tbb where tbc.classid = tbb.id
) N
WHERE id = A.id and name = A.name
FOR XML AUTO), '<N classname="', ','), '"/>', ''), 1, 1, '')
)N
order by id

drop table tba,tbb

/*
id classname name
----------- -------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(3 行受影响)
*/
dawugui 2008-01-23
  • 打赏
  • 举报
回复
--分解字符串包含的信息值去另外一表查询相应的信息
(爱新觉罗.毓华 2007-12-22 广东深圳)

/*问题描述:
需要将用户表中的用户组与信息表中的用户组对比.如果有相同的组则可查看该信息.
一个用户可能是几个用户组的成员.一条信息可能是几个用户组都可以查看.

表一
ID usergroup username
1 1,2,4 用户A
2 3 用户B

表二
id usergroup title
1 1,3,4 信息标题1
2 3 信息标题2
3 1,2,3 信息标题3

用户A可以看到
表二中的
信息标题1
信息标题3

用户B可以看到
表二中的
信息标题1
信息标题2
信息标题3
*/

-------------------------------------------------------------
--sql server 2000中用临时表的写法.
create table TB(ID int,usergroup varchar(20),username varchar(10))
insert into TB values(1,'1,2,4','用户A')
insert into TB values(2,'3' ,'用户B')
create table TA(id int,usergroup varchar(20),title varchar(10))
insert into TA values(1,'1,3,4','信息标题1')
insert into TA values(2,'3' ,'信息标题2')
insert into TA values(3,'1,2,3','信息标题3')
go

--建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1) INTO tmp FROM syscolumns a, syscolumns b

select distinct c.username , d.title from
(
SELECT A.username,usergroup = SUBSTRING(A.usergroup, B.ID, CHARINDEX(',', A.usergroup + ',', B.ID) - B.ID) FROM tb A, tmp B WHERE SUBSTRING(',' + a.usergroup, B.id, 1) = ','
) c, TA d
where charindex(',' + c.usergroup + ',' , ',' + d.usergroup + ',') > 0
order by username , title

drop table TB,TA,tmp

/*
username title
---------- ----------
用户A 信息标题1
用户A 信息标题3
用户B 信息标题1
用户B 信息标题2
用户B 信息标题3

(5 行受影响)
*/

--------------------------------------------------------------------
--sql server 2000中不用临时表的SQL语句.
create table TB(ID int,usergroup varchar(20),username varchar(10))
insert into TB values(1,'1,2,4','用户A')
insert into TB values(2,'3' ,'用户B')
create table TA(id int,usergroup varchar(20),title varchar(10))
insert into TA values(1,'1,3,4','信息标题1')
insert into TA values(2,'3' ,'信息标题2')
insert into TA values(3,'1,2,3','信息标题3')
go

select distinct c.username , d.title from
(
select a.username,usergroup=substring(a.usergroup,b.id,charindex(',',a.usergroup+',',b.id)-b.id)
from tb a,(select 1 as id union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 10 union select 11 union select 12 union select 13 union select 14 union select 15) b
where substring(','+a.usergroup,b.id,1)=','
) c, TA d
where charindex(',' + c.usergroup + ',' , ',' + d.usergroup + ',') > 0
order by username , title

drop table TB,TA

/*
username title
---------- ----------
用户A 信息标题1
用户A 信息标题3
用户B 信息标题1
用户B 信息标题2
用户B 信息标题3

(5 行受影响)
*/

-------------------------------------------------------------------
--sql server 2005中的写法.
create table TB(ID int,usergroup varchar(20),username varchar(10))
insert into TB values(1,'1,2,4','用户A')
insert into TB values(2,'3' ,'用户B')
create table TA(id int,usergroup varchar(20),title varchar(10))
insert into TA values(1,'1,3,4','信息标题1')
insert into TA values(2,'3' ,'信息标题2')
insert into TA values(3,'1,2,3','信息标题3')
go

select distinct c.username , d.title from
(
SELECT A.username, B.usergroup FROM(SELECT username, [usergroup] = CONVERT(xml,'<root><v>' + REPLACE([usergroup], ',', '</v><v>') + '</v></root>') FROM TB)A
OUTER APPLY(SELECT usergroup = N.v.value('.', 'varchar(100)') FROM A.[usergroup].nodes('/root/v') N(v))B
) c, TA d
where charindex(',' + c.usergroup + ',' , ',' + d.usergroup + ',') > 0
order by username , title

drop table TB,TA

/*
username title
---------- ----------
用户A 信息标题1
用户A 信息标题3
用户B 信息标题1
用户B 信息标题2
用户B 信息标题3

(5 行受影响)
*/


-狙击手- 2008-01-23
  • 打赏
  • 举报
回复
create table 表1  (
id varchar(5),
name varchar(10),
Technical varchar(30)
)

insert 表1 select
'01', '张三', '00001,00002'
union all select
'02', '李四', '00001,00002,00003'


create table 表2 (
id varchar(10),
name varchar(10)
)
insert 表2 select
'00001', '项目经理'
union all select
'00002', '法人代表'
union all select
'00003', 'CTO'

go


create function f_hb(@id varchar(100))
returns varchar(1000)
as
begin

declare @str varchar(1000)
set @str=''
declare @i int
set @id = @id + ','
set @i = charindex(',',@id)
while @i > 0
begin
set @str=@str+','+ (select name from 表2 where id = substring(@id,1,@i -1))
set @Id = stuff(@id,1,@I,'')
set @i = charindex(',',@id)
end

return stuff(@str,1,1,'')
end
go

select *,Technical=dbo.f_hb(Technical)
from 表1

/*

id name Technical Technical
----- ---------- ------------------------------ -------------------------
01 张三 00001,00002 项目经理,法人代表
02 李四 00001,00002,00003 项目经理,法人代表,CTO

(所影响的行数为 2 行)
*/

drop table 表2,表1
drop function f_hb
wzy_love_sly 2008-01-23
  • 打赏
  • 举报
回复
up jf
eyuannet 2008-01-23
  • 打赏
  • 举报
回复
MARK
昵称被占用了 2008-01-23
  • 打赏
  • 举报
回复
你定义一个表变量,insert @t select ...

update
select
不就可以了


chenguang79 2008-01-23
  • 打赏
  • 举报
回复
二位大哥,这样的话,表里面的内容不是被修改了吗,我不改表里的内容。只是在显示的时候把编号变与文字
昵称被占用了 2008-01-23
  • 打赏
  • 举报
回复
declare @表1 table (
id varchar(5),
name varchar(10),
Technical varchar(30)
)

insert @表1 select
'01', '张三', '00001,00002'
union all select
'02', '李四', '00001,00002,00003'


declare @表2 table (
id varchar(10),
name varchar(10)
)
insert @表2 select
'00001', '项目经理'
union all select
'00002', '法人代表'
union all select
'00003', 'CTO'

while exists (select 1 from @表1 a,@表2 b where a.Technical like '%'+b.id+'%')
update a
set Technical=replace(a.Technical,b.id,b.name)
from @表1 a,@表2 b
where a.Technical like '%'+b.id+'%'

select * from @表1

--结果
id name Technical
----- ---------- ------------------------------
01 张三 项目经理,法人代表
02 李四 项目经理,法人代表,CTO

(所影响的行数为 2 行)
liangCK 2008-01-23
  • 打赏
  • 举报
回复
tba
ID classid name
1 1,2,3 西服
2 2,3 中山装
3 1,3 名裤


tbb
id classname
1 衣服
2 上衣
3 裤子

我得的结果是
id classname name
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤

create table tba(ID int,classid varchar(20),name varchar(10))
insert into tba values(1,'1,2,3','西服')
insert into tba values(2,'2,3' ,'中山装')
insert into tba values(3,'1,3' ,'名裤')
create table tbb(ID varchar(10), classname varchar(10))
insert into tbb values('1','衣服')
insert into tbb values('2','上衣')
insert into tbb values('3','裤子')
go

--第1种方法,创建函数来显示
create function f_hb(@id varchar(10))
returns varchar(1000)
as
begin
declare @str varchar(1000)
set @str=''
select @str=@str+','+[classname] from tbb where charindex(','+cast(id as varchar)+',',','+@id+',')>0
return stuff(@str,1,1,'')
end
go
select id,classid=dbo.f_hb(classid),name from tba
drop function f_hb
/*
id classid name
----------- ------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(所影响的行数为 3 行)
*/

--第2种方法.update
while(exists (select * from tba,tbb where charindex(tbb.id,tba.classid) >0))
update tba
set classid= replace(classid,tbb.id,tbb.classname)
from tbb
where charindex(tbb.id,tba.classid)>0
select * from tba
/*
ID classid name
----------- -------------------- ----------
1 衣服,上衣,裤子 西服
2 上衣,裤子 中山装
3 衣服,裤子 名裤
(所影响的行数为 3 行)
*/
drop table tba,tbb
JiangHongTao 2008-01-23
  • 打赏
  • 举报
回复
LZ,结贴给分吧,没有再比我得简单得了。
JiangHongTao 2008-01-23
  • 打赏
  • 举报
回复

drop table a,b
create table a (
id varchar(5),
name varchar(10),
T varchar(30)
)

insert a select '01', '张三', '00001,00002'
union all select
'02', '李四', '00001,00002,00003'
create table b (
id varchar(10),
name varchar(10)
)
insert b select
'00001', '项目经理'
union all select
'00002', '法人代表'
union all select
'00003', 'CTO'


go
create function dbo.getname(@s varchar(100))
returns varchar(100)
as
begin
select @s = replace(@s,id,name) from b
return @s
end
go

select a.id,a.name,dbo.getname(t) from a
/*
id name
----- ---------- ----------------------
01 张三 项目经理,法人代表
02 李四 项目经理,法人代表,CTO

*/
eyuannet 2008-01-23
  • 打赏
  • 举报
回复
越整越复制xml都整出来了!
用SQL实现不了吗??

34,588

社区成员

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

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