您的位置:首页 > 数据库

一条常见的行合并问题(SQL)

2007-12-05 16:43 351 查看
原来问题:现有两个表:

表一originalword

ID word

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

101
about

102 abound

103 beard

104 boast

105
beast

表二similarword

ID original_id
similar_id

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

1 101
102

2 102 101

3 103
105

4 105 103

5
104 105

6 105
104

表originalword和表similarword有关系:

表similarword的original_id是表originalword中的ID

表similarword的similar_id也是表originalword中的ID

第一个表是一个单词表,是源单词

第二个表是由第一个表来的,是形近词的id列表

如表一中的101和102是形近词,则在第二个表中我插入了(101,102)和(102,101)两个记录

103和104分别和105是形近词,则在第二个表中我插入了(103,105)、(105,103)、(104,105)、(105,104)四个记录

想查询出如下的结果:

结果表

originalword.ID orig_word similar_word

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

101
about abound

102 abound
about

103 beard beast

104 boast beast

105
beast beard, boast

请大家帮忙啊,写个查询语句,急!谢谢先!

在线等...

这样的问题一般写个自定义函数,由orig_word 统计similar_word,就可以实现。

来自一朋友叫hxd001_810,使用自定义函数的方法:

用函数解决之。代码如下:

--创建一个合并的函数

create function f_hb(@original_id
varchar(10))

returns varchar(8000)

as

begin

declare @str
varchar(8000)

set @str = ''

select @str = @str + ',' +b.word

from similarword a inner join dbo.originalword b on a.similar_id=b.ID

where original_id = @original_id

set @str = right(@str , len(@str) -
1)

return(@str)

End

go

--调用自定义函数得到结果:

select distinct
a.original_id [originalword.ID],b.word [orig_word],dbo.f_hb(a.original_id) as
similar_id

from similarword a inner join dbo.originalword b on
a.original_id=b.ID

go

返回:

originalword.ID orig_word similar_id

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

101 about
abound

102 abound about

103 beard
beast

104 boast beast

105 beast
beard,boast

(所影响的行数为 5 行)

从性能分析,个人认为使用自定义函数性能比使用循环语句效率低一点,特别是在处理大量数据时候。

以下是自己写的一个使用循环的方法:

SET NOCOUNT ON

CREATE TABLE originalword(id int ,word nvarchar(30))

CREATE
TABLE similarword (ID int ,original_id int,similar_id int)

GO

INSERT INTO
originalword

SELECT 101, 'about' UNION ALL

SELECT 102, 'abound'
UNION ALL

SELECT 103, 'beard' UNION ALL

SELECT 104, 'boast'
UNION ALL

SELECT 105, 'beast'

INSERT INTO similarword

SELECT 1,
101, 102 UNION ALL

SELECT 2, 102,
101 UNION ALL

SELECT 3, 103,
105 UNION ALL

SELECT 4, 105, 103 UNION
ALL

SELECT 5, 104, 105 UNION ALL

SELECT
6, 105, 104

GO

DECLARE @Result
TABLE(id int IDENTITY(1,1),[originalword.ID] int,orig_word
nvarchar(30),similar_word nvarchar(30))

INSERT INTO @Result
([originalword.ID],orig_word) SELECT * FROM originalword

DECLARE @i int

,@j int

,@similar_word nvarchar(200)

SELECT
@i=1,@j=ISNULL(COUNT(1),0) FROM @Result

WHILE @i<=@j

BEGIN

SET @similar_word=''

SELECT
@similar_word=@similar_word+word+',' FROM

(SELECT
B.word FROM similarword A INNER JOIN originalword B ON A.original_id=B.ID

AND EXISTS(SELECT 1 FROM @Result C WHERE
C.[originalword.ID]=A.original_id AND C.ID=@i)) Tmp

IF(ISNULL(@similar_word,'')<>'')

UPDATE @Result
SET similar_word=SUBSTRING(@similar_word,1,LEN(@similar_word)-1) WHERE
ID=@i

SET @i=@i+1

END

SELECT
[originalword.ID],orig_word,similar_word FROM @Result

GO

DROP
TABLE originalword,similarword

GO

原帖子:http://www.itpub.net/thread-903644-1-2.html

完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: