一条常见的行合并问题(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
完。
表一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
完。
相关文章推荐
- SQL语句中一条常见的行合并问题
- 【SQL常用问题】——合并列值
- 不定时常见问题记录(SQL)
- sql多行转为一列的合并问题
- 一条sql语句的优化 (问题整理篇)
- SQL Server Express常见问题及解决办法
- SQL反模式笔记17——用一条sql解决复杂问题
- powerDesigner生成sql一些常见问题解决
- SQL 合并多条记录成一条记录
- 一条sql语句 (合并结果)
- sqlplus 运行大量sql脚本时遇到问题分析(很常见)
- 一个SQL按照类别各取一条记录查询问题
- SQL中与IP相关的常见问题
- oracle sql多条数据合并成一条,数据量大,用逗号隔开
- SQL语句常见问题的总结(持续更新)
- 【常见Web应用安全问题】---13、Blind SQL/XPath injection
- SQL中的行合并问题(转)
- 遗留问题——sql面试篇(动态合并单表数据)
- T-sql GroupBy语句常见问题处理
- SQL Report Builder 报表里面的常见问题分析