首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

年底了,本想安心过年,结果领导给了个变态的题目,郁闷解决方法

2012-02-03 
年底了,本想安心过年,结果领导给了个变态的题目,郁闷表:duizhaoidzyidzynamegsidgsnames1001aaa100aaab200

年底了,本想安心过年,结果领导给了个变态的题目,郁闷
表: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()转化成字符看看

热点排行