_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

SQL 语句中一条常见的行合并问题

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:SQL数据库

  问题:原来问题:现有两个表:

  表一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
 

 


    希望这篇SQL 语句中一条常见的行合并问题的文章能够对您有所帮助,如果您觉得这篇网站维护教程有用的话,别忘了推荐给您的朋友哦!如果您有好的经验方法,不妨拿出来和大家一起分享:假如每个人都拿出一个经验,那么我们都将额外的获取一堆他人的经验。
请记住本站永久域名:(黑客防线网安服务器维护方案维护基地)Www.Rongsen.Com.Cn
    黑客防线网安服务器维护方案本篇连接:http://kj.rongsen.com.cn/show-10641-1.html
网站维护教程更新时间:2012-03-21 03:07:10  【打印此页】  【关闭
0
顶一下
0
踩一下
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer