zoukankan      html  css  js  c++  java
  • SQL语句技巧复杂逻辑的SQL简单实现(2)

        前段时间,公司的同事,处理一个业务要求 ,说比较复杂,不想通过语句一个一个机构去递归查询配置信息,如过本机构没有,则去取其上一级机构的配置信息,直到最高层,希望通过一条sql查询出信息:

       

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

     表和业务要求说明:   

    --表selfcustom 表存放了机构定义的信息,可能存放了等不同机构的配置信息,id为唯一数据,objid存放的是机构id,config为机构定义的信息数据。
    --但一个机构只存放一条信息,但该机构可能是办事处,分公司,片区,总公司
    --表orgunitlink的 字段col1存放了当前机构的全部上级机构,并按级别大小顺序存放,oid为本级机构,pid为上一级机构id。
    --如(总公司,某大区,某分公司)col1存放的id数据格式如下:(02881e70ad1d990010ad1e5ec930008,402881e70ad1d990010ad1e5ec930008,402881e70ad1d990010ad1e5ec930008两个挂号不属于数据内容

    要求:
    前台传入一个机构id,要求查询该机构的配置config信息,
    --如果是本级机构没有,去取上一级的机构,直到最高级机构的配置信息,如果最高级没有,返回没有数据。如果有,只返回一条机构配置信息数据
     

    注意:数据库存放的所有id都是32位字符串

      测试数据:

    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
  • 相关阅读:
    txtbox取Calendar值
    【Spread Sheet 应用(一)】去掉原有功能键及添加功能键
    【SQLSERVER】存储过程基础
    【SQLSERVER】在存储过程中调用存储过程
    ASP.NET跨页面传值技巧(VB.NET篇)
    【EXCEL】IF...ELSE语句
    VB单元测试
    【VB.NET】窗体之间传值
    【Spread Sheet 应用(二)】常用属性设置
    【SQLSERCER】创建、改变、删除索引
  • 原文地址:https://www.cnblogs.com/zping/p/1276772.html
Copyright © 2011-2022 走看看