我们目前正在使用MS SQL Server 2005,但很快将迁移到2012年(或2014年)。 我面临以下情况。
数据表(数据)
id | location | group | level
-----+----------+--------+---------
1 | loc1 | A | 1
2 | loc1 | B | 5
3 | loc1 | A | 9
4 | loc1 | A | 12
5 | loc2 | A | 1
6 | loc2 | B | 5
此安全表(安全性)
user | location | group | level from | level to
-----+----------+-------+------------+----------
u1 | loc1 | A | 1 | 5
u1 | loc1 | A | 10 | 15
u1 | loc2 | | 4 | 9
逻辑是安全表中一行的每个值都与“和”连接(如果不为空),每行都带有“或”。
目前,我在存储过程中动态构建where子句作为简单字符串。这适用于为单个用户定义的少量安全行,但需要5000多行的时间。
示例:
select id from data
where location = 'loc1' and and group='A' and level>=1 and level <=5
location = 'loc1' and group='A' and level>=10 and level <=15
or location = 'loc2' and level>=4 and level <=9
- &GT; id:1,4,5,6
我没有看到任何方法在SQL方面以智能方式执行此操作。 有没有人有建议?
答案 0 :(得分:1)
Select distinct id from data
Inner join security on data.location = security.location
And data.group = security.group
And data.level between security.[level from] and [level to]
不同的部分是防止从查询中提供重复的结果