日期:2014-05-18  浏览次数:20607 次

SQL字符串並集疑問
ID col
1 1,2,3,44,5
1 1,3,4
1 1,4
2 11,3,4
2 1,33,4
3 1,3,4

結果
ID col
1 1,2,3,4,44,5
2 1,11,3,33,4
3 1,3,4

代碼如下:
create function dbo.f_mergSTR(@ID int)
returns varchar(50)
as 
begin
declare @t Table(ID int identity,b bit)
insert @t(b) select top 50 0 from syscolumns
declare @r varchar(50)
set @r=''
select @r=@r+','+s
from(
select s=SUBSTRING(a.col,b.ID,CHARINDEX(',',a.col+',',b.ID)-b.ID)
from tb a,@t b
where a.ID=@ID
and b.ID<=len(a.col)
and SUBSTRING(','+a.col,b.ID,1)=','
group by substring(a.col,b.ID,CHARINDEX(',',a.col+',',b.ID)-b.ID)) a order by s
return(stuff(@r,1,1,''))
end
go

select ID,col=dbo.f_mergSTR(ID)
from tb
group by ID

問題如下:
1.insert @t(b) select top 50 0 from syscolumns此句怎麽理解,為什麽使用syscolumns?
2.select @r=@r+','+s此句"s"從哪裏來?為何不用定義就可以使用?
3.select s=SUBSTRING(a.col,b.ID,CHARINDEX(',',a.col+',',b.ID)-b.ID)此句"a"和"b"又是從哪裏來?為何不用定義就可以使用?

------解决方案--------------------
1.insert @t(b) select top 50 0 from syscolumns此句怎麽理解,為什麽使用syscolumns?
随便写的表,一般是系统表,只需要超过50行就可以了

2.select @r=@r+','+s此句"s"從哪裏來?為何不用定義就可以使用?
from (这里自定义的列名)

3.select s=SUBSTRING(a.col,b.ID,CHARINDEX(',',a.col+',',b.ID)-b.ID)此句"a"和"b"又是從哪裏來?為何不用定義就可以使用?
from tb a,@t b 表的别名,a相当于tb表, b相当于@T表

------解决方案--------------------
这个...

1) 不知道这个 select top 50 0 from syscolumn --- 为什么是top 50 0

2) s 是从那个大的subquery来的, 就是那个大的from

3) a 和 b是从 from tb a, @t b中来的
------解决方案--------------------
--- 为什么是top 50 0 
这里的50是关系到数据模型的大小, 只要达到max(tb.col)即可;
后面的bit(0)在后面没有用到, 只是为了构造@t Table这个临时表;