用函式實現mysql和sqlserver的樹查詢

2021-08-26 21:13:56 字數 2554 閱讀 2267

幹活的時候 遇到要用sql語句做樹查詢(mysql和sqlserver) 這些思路都是我看其他兄弟姐妹的....能用但可能寫得不怎麼好  函式返回的都是以逗號分隔開的id字串

mysql:

查詢當前節點和他的祖先節點

create definer=`root`@`%` function `org_getparents`(childid varchar(32)) returns varchar(10000) begin -- 獲取機構父節點,包括本身 declare stemp varchar(10000); declare stempparentid varchar(10000); set stemp =childid; set stempparentid=childid; while stempparentid!='0' do select parent_id into stempparentid from org where org_id=stempparentid; if stempparentid is not null then set stemp = concat(stemp,',',stempparentid); end if; end while; return stemp; end

查詢當前節點和他的子孫節點

create definer=`root`@`%` function `org_getchilds`(rootid varchar(32)) returns varchar(10000) begin -- 獲取機構所有子節點,包括本身 declare stemp varchar(10000); declare stempchd varchar(10000); set stemp = rootid; set stempchd = rootid; while stempchd is not null do select group_concat(org_id) into stempchd from org where find_in_set(parent_id,stempchd) > 0; if stempchd is not null then set stemp = concat(stemp,',',stempchd); end if; end while; return stemp; end

可以這樣使用: select * from org where find_in_set(org_id,org_getchilds('1')); 

select * from org where find_in_set(org_id,org_getparents('1'));

sqlserver:

查詢當前節點和他的祖先節點: create function [dbo].[org_getparents] ( -- add the parameters for the function here @rootid varchar(50) ) returns varchar(8000) as begin -- declare the return variable here declare @temp varchar(8000) declare @tempid varchar(8000) -- add the t-sql statements to compute the return value here set @tempid=@rootid; set @temp=@rootid; while @tempid!='0' begin select @tempid=parent_id from org where org_id= @tempid; if @tempid!='0' set @temp =@temp+','+@tempid; end -- return the result of the function return @temp end

查詢當前節點和他的子孫節點 create function [dbo].[org_getchilds] ( -- add the parameters for the function here @rootid varchar(50) ) returns varchar(8000) as begin -- declare the return variable here declare @temp varchar(8000) -- add the t-sql statements to compute the return value here select @temp=org_id from org where org_id=@rootid while @@rowcount>0 select @temp=@temp+','+org_id from org where charindex(org_id,@temp)=0 and charindex(parent_id,@temp)>0 -- return the result of the function return @temp end 

可以這樣用:

select * from org where charindex(org_id,dbo.org_getchilds('1'))>0

select * from org where charindex(org_id,dbo.group_getparents('1'))>0

用mysql實現oracle sequence功能

由於mysq只有遞增列的概念沒有oracle的sequence功能,這樣對於以前習慣用oracle資料庫開發的程式設計師不太實用,尤其在要使用nextval在獲取增長序列的時候。這樣就設計乙個能模擬oracle sequence的功能。思路 我們可以用一張表來記錄sequence資料,其實在使用or...

函式實現 MySQL排名函式實現

現在有個需求對所有學生分數進行排名,並且列出名次。剛看到這個需求,我有點懵逼,完全沒有思路?為什麼難一點需求,我就不會做呢?去網上查詢資料,把所有實現都列出來,全部都要學會。建立乙個分數表s score create table s score id int not null auto increm...

淺用mysql比較函式

今天在運算元據庫時,遇到乙個問題 修改表中某條資料,比較某個字段原有值和修改值,如果原有值大於修改值,則這個欄位不修改,從而引出了是用mysql的比較函式 舉個例子,我現在有乙個users表,其中字段分別為id,name,age,id是key。表中原有資料如下 id name age 16 yang...