年底了,本想安心过年,结果领导给了个变态的题目,郁闷
表:duizhao
id zyid zyname gsid gsnames
1 001 aaa 100 aaab
2 001 aaa 101 aaac
3 001 aaa 102 aaad
4 002 bbb 103 bbbc
5 002 bbb 104 bbbf
6 003 ccc 105 cccs
7 004 ddd 106 dddf
8 005 eee 107 eees
9 006 fff 108 fffs
10 006 ggg 109 ggsd
表:t_login
id gsid 公司名称 用户名 查询范围
21 100 aaab alibaba 100,103,106,107,109
比较郁闷的一个问题,如上面二个表所示,表duizhoa 表示大类公司与相应的公司名称对应关系,比如:
gsid为100,101,102的公司都属于zyid为001的公司,现在的需求是,用户alibaba有一个查询权限,他可
以查询对应的gsid为100,103,106,107,109的公司信息(这是以前为某一功能设定的),现在有另外一个
需求需要实际上实现如下的功能,用户alibaba对应的查询范围是100,103,106,107,109 --我需要根据
这几个gsid查询出他所对应的zyid,那么可以查询出的用户alibaba对应的zyid分别是:001,002,004,005,006
然后呢,根据这几个对应的zyid查出他们所对应的所有gsid,也就是结果:100,101,102,103,104,106,107,108
晕啊,是我笨还是这个题目本身太变态,郁闷死了,然后再根据这个结果执行相应的语句。
把我查询的语句帖出来,大家帮看一下,有什么比较效率高的解决方案。
假定用户登陆时建立了“查询范围”这个字段的session fanwei=session( "查询范围 ')
那么:
1. select distinct zyid from duizhao where gsid in (也就是这个session "查询范围 ")
2. select gsid from duizhao where zyid in (第一步得出的结果)
3. 执行语句
再将下面的语句:
select aa.zyname ,sum(批复金额) as 申请用款总额 from
(
select 公司id,公司名称,审批金额,批复金额,请求时间,批复日期 from
(select * from a
union all
select * from b
) tt
where gsid in (422,480,496,410,370,423,456,54,522,546,670)
)tt ,duizhao aa where aa.gsid = tt.公司id group by aa.zyname
我不知道要如何来写这个存储过程了,主要是这个gsid与zyid的来回传递,晕了Q·我总觉得领导给的这个题目比较
变态,没有意义,但没有办法,请高手出招吧!让兄弟也过个年吧!
[解决办法]
create proc Exe
@id int
as
declare @s varchar(100)
declare @a varchar(1000)
select @s=查询范围 from t_login where id=@id
select gsid from duizhao where zyid in(select zyid from duizhao where charindex( ', '+ltrim(gsid)+ ', ', ', '+@s+ ', ')> 0)
执行......
[解决办法]
create table duizhao(id int, zyid varchar(10), zyname varchar(10), gsid int, gsnames varchar(10))
insert duizhao select 1 , '001 ', 'aaa ', '100 ', 'aaab '
union all select 2 , '001 ', 'aaa ', '101 ', 'aaac '
union all select 3 , '001 ', 'aaa ', '102 ', 'aaad '
union all select 4 , '002 ', 'bbb ', '103 ', 'bbbc '
union all select 5 , '002 ', 'bbb ', '104 ', 'bbbf '
union all select 6 , '003 ', 'ccc ', '105 ', 'cccs '
union all select 7 , '004 ', 'ddd ', '106 ', 'dddf '
union all select 8 , '005 ', 'eee ', '107 ', 'eees '
union all select 9 , '006 ', 'fff ', '108 ', 'fffs '
union all select 10, '006 ', 'ggg ', '109 ', 'ggsd '
create table t_login(id int, gsid int, 公司名称 varchar(10), 用户名 varchar(10), 查询范围 varchar(100))
insert t_login select 21, 100, 'aaab ', 'alibaba ', '100,103,106,107,109 '
select * from duizhao as tmp
where exists
(
select * from duizhao as tmpA
where exists
(
select 1 from t_login
where 用户名= 'alibaba ' and charindex(rtrim(tmpA.gsid), 查询范围)> 0
) and zyid = tmp.zyid
)
--result
id zyid zyname gsid gsnames
----------- ---------- ---------- ----------- ----------
1 001 aaa 100 aaab
2 001 aaa 101 aaac
3 001 aaa 102 aaad
4 002 bbb 103 bbbc
5 002 bbb 104 bbbf
7 004 ddd 106 dddf
8 005 eee 107 eees
9 006 fff 108 fffs
10 006 ggg 109 ggsd
(9 row(s) affected)
[解决办法]
SELECT gsid FROM duizhao WHERE zyid
IN (SELECT zyid FROM duizhao WHERE gsid IN (SELECT 查询范围 FROM t_login WHERE 用户名=alibaba))
不知道能不能支持这么多层
待会试一下
[解决办法]
select * from duizhao
where zyid in
(
select zyid from duizhao a
where (select 查询范围 from t_login where 用户名= 'alibaba ') like '% '+rtrim(a.gsid)+ '% '
)
[解决办法]
错了。。
select aa.zyname ,sum(批复金额) as 申请用款总额 from
(
select 公司id,公司名称,审批金额,批复金额,请求时间,批复日期 from
(select * from a
union all
select * from b
) tt
where (select 查询范围 from t_login where 用户名= 'alibaba ') like '% '+rtrim(gsid)+ '% '
)tt ,duizhao aa where aa.gsid = tt.公司id group by aa.zyname
[解决办法]
rtrim(gsid) in (case when @companyname is null or @companyname=0 then rtrim(gsid) else
(select gsid from duizhaobiao as tmp
where exists
(
select * from duizhaobiao as tmpA
where exists
(
select 1 from t_userlogin
where
charindex(rtrim(tmpA.gsid),@companyname)> 0
) and zyid = tmp.zyid ))
end )
先不考虑效率,都+RTRIM()转化成字符看看