SQL語句技巧--複雜邏輯的SQL簡單實現(2)

 前段時間,公司的同事,處理一個業務要求 ,說比較複雜,不想經過語句一個一個機構去遞歸查詢配置信息,如過本機構沒有,則去取其上一級機構的配置信息,直到最高層,但願經過一條sql查詢出信息:sql

   

複製代碼

CREATE TABLE [dbo].[orgunitlink](
    [id] [char](32) NOT NULL,
    [oid] [char](32) NULL,
    [pid] [char](32) NULL,
    [col1] [varchar](1000),
    [name] varchar(20)
 ) 
CREATE TABLE [dbo].[selfcustom](
    [id] [char](32) NOT NULL,
    [objid] [char](32) NOT NULL,
    [config] [varchar](256)NULL,
 ) 數據庫

複製代碼

 

 表和業務要求說明:   

複製代碼

--表selfcustom 表存放了機構定義的信息,可能存放了等不一樣機構的配置信息,id爲惟一數據,objid存放的是機構id,config爲機構定義的信息數據。
--但一個機構只存放一條信息,但該機構多是辦事處,分公司,片區,總公司
--表orgunitlink的 字段col1存放了當前機構的所有上級機構,並按級別大小順序存放,oid爲本級機構,pid爲上一級機構id。
--如(總公司,某大區,某分公司)col1存放的id數據格式以下:(02881e70ad1d990010ad1e5ec930008,402881e70ad1d990010ad1e5ec930008,402881e70ad1d990010ad1e5ec930008)  兩個掛號不屬於數據內容測試

要求:
前臺傳入一個機構id,要求查詢該機構的配置config信息,
--若是是本級機構沒有,去取上一級的機構,直到最高級機構的配置信息,若是最高級沒有,返回沒有數據。若是有,只返回一條機構配置信息數據
 spa

注意:數據庫存放的全部id都是32位字符串3d

複製代碼

 

  測試數據:

複製代碼

insert into [orgunitlink](id,oid,pid,col1,[name]) values
('402882a11bc3ebb9011bc44bba50001a','402881e70ad1d990010ad1e5ec930008',null,null,'總公司')--總公司
insert into [orgunitlink](id,oid,pid,col1,[name]) values
('402881e70ad1d990010ad1e5ec930008','402882951b449413011b44c99342004c','402881e70ad1d990010ad1e5ec930008',
'402881e70ad1d990010ad1e5ec930008','華東大區')--華東大區
insert into [orgunitlink](id,oid,pid,col1,[name]) values
('402882951b449413011b44c99352004d','402881e510e8223c0110e83d427f0018','402882951b449413011b44c99342004c'
,'402881e70ad1d990010ad1e5ec930008,402882951b449413011b44c99342004c','上海分公司')--上海分公司
insert into [orgunitlink](id,oid,pid,col1,[name]) values
('4028819e181e984c01181f5874f703f1','402881e510e8223c0110e83d427f0011','402881e510e8223c0110e83d427f0018',
'402881e70ad1d990010ad1e5ec930008,402882951b449413011b44c99342004c,402881e510e8223c0110e83d427f0018','浦東辦事處')--浦東辦事處

insert into [orgunitlink](id,oid,pid,col1,[name]) values
('402882951b449413011b44c99352004d','297e1ba00c0b501f010c0b7254870005','402881e70ad1d990010ad1e5ec930008',
'402881e70ad1d990010ad1e5ec930008','華北大區')--華北大區
insert into [orgunitlink](id,oid,pid,col1,[name]) values
('402881e60c85ac00010c866bc5350065','402881e70be6d209010be75668750014','297e1ba00c0b501f010c0b7254870005',
'402881e70ad1d990010ad1e5ec930008,297e1ba00c0b501f010c0b7254870005','北京分公司')--北京分公司

insert into [selfcustom](id,objid,config) 
values('297e828210f211130110f21d99710008','402881e70ad1d990010ad1e5ec930008','總公司配置信息')
insert into [selfcustom](id,objid,config) 
values('297e828210f211130110f21d99710009','297e1ba00c0b501f010c0b7254870005','華北大大區配置信息')
insert into [selfcustom](id,objid,config) 
values('297e828210f211130110f21d99710010','402881e70be6d209010be75668750014','北京分公司配置信息')

--傳入:表[selfcustom]中的[objid]='402881e510e8223c0110e83d427f0018'爲"浦東辦事處",
--要求查詢出總公司的配置config:"總公司配置信息"遞歸

複製代碼

 

  最後的T_SQL代碼:   

select top 1 config from (
select  CHARINDEX(c.objid,b.col1)/32 rnd, c.config from orgunitlink  b,
[selfcustom] c where
b.oid='402881e510e8223c0110e83d427f0018'
and b.col1 like '%'+c.objid+'%' ) 
k order by  k.rnd desc字符串

相關文章
相關標籤/搜索