请各位前辈赐教:1.用SQL语句如何 由Tb1、tb2 得到结果tb3 ??
2.tb3的字段数是先固定还是随机的好?做报表用的
先谢了!!tb1:a b(varchar)
aa 1,2,3
bb 4
tb2 :b1(int) b2
1 桌子
2 椅子
3 书包
4 铅笔
结果 tb3 :A1 A2 A3 A4 A5
aa 1,2,3 桌子 椅子 书包
bb 4 铅笔
2.tb3的字段数是先固定还是随机的好?做报表用的
先谢了!!tb1:a b(varchar)
aa 1,2,3
bb 4
tb2 :b1(int) b2
1 桌子
2 椅子
3 书包
4 铅笔
结果 tb3 :A1 A2 A3 A4 A5
aa 1,2,3 桌子 椅子 书包
bb 4 铅笔
GO
if not object_id('A') is null
drop table A
Go
Create table A([id] int,[cname] nvarchar(2))
Insert A
select 1,N'张三' union all
select 2,N'李四' union all
select 3,N'王五' union all
select 4,N'蔡六'
Go
--> -->
if not object_id('B') is null
drop table B
Go
Create table B([id] int,[cname] nvarchar(5))
Insert B
select 1,N'1,2,3' union all
select 2,N'3,4'
Go
create function F_str(@cname nvarchar(100))
returns nvarchar(100)
as
begin
select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from Bid cname
1 张三,李四,王五
2 王五,蔡六(2 個資料列受到影響)
我现在有一字段值为:a,b,c
分隔符为逗号.
我现在想实现目地值为:
字段:
id name
1 a
2 b
3 c
在SQL中咋实现呢?
declare @str varchar(8000)
set @str = 'a1,b1,c2,d1,e3,f5'
set @str = 'select name='''+replace(@str,',',''''+' union all select ''')+''''
set @str='select id=identity(int,1,1),name into #temp from ('+@str+') a select * from #temp drop table #temp'
exec(@str)
--参考:
CREATE TABLE TB(ID VARCHAR(6), COLOR NVARCHAR(30))
INSERT TB
SELECT '173160', N'#特深蓝色,#特深蓝色' UNION ALL
SELECT '173160', N'#特深蓝色,#特深蓝色' UNION ALL
SELECT '911169', N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL
SELECT '911169', N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL
SELECT '911169', N'#宝蓝色,#宝蓝色,#花灰色,#花灰色' UNION ALL
SELECT '911169', N'#宝蓝色,#宝蓝色,#花灰色,#花灰色'
GO
CREATE FUNCTION F_getStr(@color nvarchar(30))
returns nvarchar(30)
as
begin
declare @str nvarchar(30),@temp nvarchar(30)
set @str=''
set @temp=''
while charindex(',', @color+',')>0
begin
set @temp=left(@color, charindex(',', @color+',')-1)
if charindex(','+@temp+',', ','+@str+',')=0
set @str=@str+','+@temp
set @color=stuff(@color, 1, charindex(',', @color+','), '')
end
return stuff(@str, 1, 1, '')
end
go
SELECT ID,dbo.F_getStr(COLOR) as COLOR FROM TB
DROP TABLE TB
DROP FUNCTION F_getStr
/*
ID COLOR
173160 #特深蓝色
173160 #特深蓝色
911169 #宝蓝色,#花灰色
911169 #宝蓝色,#花灰色
911169 #宝蓝色,#花灰色
911169 #宝蓝色,#花灰色
*/
改改就是了
GO--Start--查询一SELECT C.ID,NUMBER = STUFF(REPLACE(REPLACE(( SELECT B.NAME AS NAME FROM TA A LEFT JOIN ( SELECT ID,NAME FROM TB ) B ON CHARINDEX(','+LTRIM(B.ID)+',',','+A.NUMBER+',')>0 WHERE A.ID = C.ID FOR XML AUTO ),'"/><B NAME="',','),'"/>',''),1,9,'')FROM TA C--查询二SELECT A.ID,NUMBER=STUFF( (SELECT ','+NAME FROM TB WHERE CHARINDEX(','+LTRIM(ID)+',',','+A.NUMBER+',')>0 FOR XML PATH(''),ROOT('R'),TYPE).value('/R[1]','NVARCHAR(MAX)') ,1,1,'') FROM TA A
--End
是否有方法能提高一下效率呢?
2.travylee 例子中的函数生成的结果只有一个字段,我是想要生成几个字段如:张三,李四,王五,应是三个字段,可以吗?
3.其他前辈的例子中有 For XML ,我在查询分析器中一执行就提示:'XML' 附近有语法错误。能否再赐教,不胜感激!