SQL語句中一條常見的行合併問題

2021-04-14 01:46:31 字數 4219 閱讀 8465

sql行合併問題一般寫個自定義函式,由orig_word 統計similar_word,就可以實現……

問題:原來問題:現有兩個表:

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

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

endselect [originalword.id],orig_word,similar_word from @result

godrop table  originalword,similarwordgo

一條常見的行合併問題 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...

MySQL中一條SQL語句的執行過程

查詢語句的執行順序 客戶端通過tcp連線傳送連線請求到mysql聯結器,聯結器會對該請求進行許可權驗證及連線資源分配 max connections,8小時超時 建立連線後客戶端傳送一條語句,mysql收到該語句後,通過命令分發器判斷其是否是一條select語句,如果是,在開啟查詢快取的情況下,先在...

sql利用在一條語句中count出不同的條件的值

過多繁瑣的sql影響 質量,及維護成本,以下為兩種小技巧處理方式,僅供參考,第二種更美觀點 第一種,用case when 方法 selectid,sum case when type in 1,2 then count else 0 end as sum1 sum case when type in...