SQL语句技巧--复杂逻辑的SQL简单实现
SQL语句技巧--复杂逻辑的SQL简单实现(1)
最近公司同事碰到需求,实现一个功能,想用一个sq语句实现,他让我看看如何实现sql。由于前期做培训时说到尽量减少和数据库的交互,能一条sql取出来就不用两次sql语句:
[id] [varchar](32) NOT NULL,
[objid] [varchar](32) NOT NULL,
[objtype] [tinyint] NULL,
[config] [varchar](256)
)
具体要求:
表[zping.com]中存放数据:id为唯一,objid存放是机构id,objtype存放的是机构类型,config字段存放的是
具体业务数据。
objid存放的可能机构id(总公司,分公司,办事处,代表处)id,只能一个,objtype存放的是机构的数字
为(总公司为1,分公司为2,办事处为3,代表处为4)
数据库里的数据可能是4个id的数据都有,也可能都没有,也可能是只有其中几个机构
业务要求:前台传入机构id(总公司,分公司,办事处,代表处id),只能返回一条数据
要求如果有总公司,取出总公司,如果没总公司,如果有分公司,取分公司...... 如果都没有则不取。
最后实现:
select top 1 [config] from ( select * from [selfcustom] where objid in(\'66\',\'77\') )
t order by objtype asc
总结:
这里主要用到了order by排序功能实现如果有总公司,就去总公司,如果有则去取分公司等。并通过top实现最多取出一条的目的。
SQL语句技巧--复杂逻辑的SQL简单实现(2)
前段时间,公司的同事,处理一个业务要求 ,说比较复杂,不想通过语句一个一个机构去递归查询配置信息,如过本机构没有,则去取其上一级机构的配置信息,直到最高层,希望通过一条sql查询出信息:
[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信息,
--如果是本级机构没有,去取上一级的机构,直到最高级机构的配置信息,如果最高级没有,返回没有数据。如果有,只返回一条机构配置信息数据
注意:数据库存放的所有id都是32位字符串
测试数据:
(\'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 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