非常复杂的SQL 高手请进。

xiaosongaspnet 软件开发  2008-02-27 11:47:42
在A 表 字段 IDS,Names ,中有两千万条记录对IDS相同的纪录Names合并,是两千万条记录,sql是2005 我用function 来合并可是运行10个小时还没有结束。那位能提供好的方法 让我优化下 提供下思路。
...全文
109 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
nzperfect 2008-03-04

是不是ids没索引啊?两kW,没索引,会慢的.
回复
yimeng123 2008-03-04
重金诚聘C++
http://topic.csdn.net/u/20080227/14/8bce0844-bd15-42f0-9cda-a343d5d6601b.html?seed=2111206245
回复
playwarcraft 2008-03-04
用臨時表合并,應該也比較快~~
回复
dawugui 2008-03-04
OUTER APPLY 和 function 那个速度快点
-----------

应该是OUTER APPLY快.
回复
xiaosongaspnet 2008-03-04
OUTER APPLY 和 function 那个速度快点
回复
dawugui 2008-02-27
sql是2005

2005不用函数,可直接使用上面的语句.

2000需要用函数.

各自具体写法,见3楼.
回复
dawugui 2008-02-27
在A 表 字段 IDS,Names ,中有两千万条记录对IDS相同的纪录Names合并,是两千万条记录,sql是2005 我用function 来合并可是运行10个小时还没有结束。那位能提供好的方法 让我优化下 提供下思路。

------------------

合并列值
原著:邹建
改编:爱新觉罗.毓华 2007-12-16 广东深圳

表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)

1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--1. 创建处理函数
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO

-- 调用函数
SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id

drop table tb
drop function dbo.f_str

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

--2、另外一种函数.
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

--创建一个合并的函数
create function f_hb(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct id ,dbo.f_hb(id) as value from tb

drop table tb
drop function dbo.f_hb

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
-- 查询处理
SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM tb N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb

/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
*/
回复
fcuandy 2008-02-27
可以看看你的function.

回复
liangCK 2008-02-27
10个小时..厉害.
回复
中国风 2008-02-27
用存储过程合并..
http://blog.csdn.net/roy_88/archive/2006/11/22/1403722.aspx
回复
qiyousyc 2008-02-27
2000万,是否有超过varchar(8000)的范围呢?
为什么不用返回结果集处理呢?
回复
相关推荐
发帖
MS-SQL Server
创建于2007-09-28

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-02-27 11:47
社区公告
暂无公告