原來問題:現有兩個表:
表一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)
asbegin
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)
endgo
--呼叫自定義函式得到結果:
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)
goinsert 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
godeclare @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
endselect [originalword.id],orig_word,similar_word from @result
godrop table originalword,similarword
go原帖子: 完。
SQL語句中一條常見的行合併問題
sql行合併問題一般寫個自定義函式,由orig word 統計similar word,就可以實現 問題 原來問題 現有兩個表 表一originalword id word 101 about 102 abound 103 beard 104 boast 105 beast 表二similarwor...
一條每n行彙總的SQL題目
根據表資料,每3行做一次統計 create table t d int insert into tselect 1union allselect 2union allselect 3union allselect 12union allselect 2union allselect 3union a...
SQL合併多條資料為一條
今天在做專案的時候,涉及到從資料庫中將多條記錄合併為一條的記錄的問題,解決方案如下 問題描述 資料庫表a中按照專案區分存放了各個月份的交易資料,也就是說乙個月的資料是按照專案區分分成了多條來儲存,現在我想 按照月份將多個專案區分的資料合併為一條。解決方案 select sum 專案1 sum 專案2...