2011-12-23 124 views
2

我处理的一个表(3+百万行,SQL Server)的 我需要根据下面的两列来筛选结果:SQL过滤搜索值

<code> 
...FromID| ToID |Column5|.... 
...1001 2001 
...1002 2020 
...1003 5000  
...1001 3000 
...2001 1001 
</code> 

现在,用户1可以访问与FromID或风湿记录1001 FromID|ToID 1001|2001 1001|3000 2001|1001

用户2可以访问记录与FromID或风湿1002,1003,3000 FromID|ToID 1002|2020 1003|5000 1001|3000

什么是大多数电子如何做到这一点? 我需要为每个用户创建一个视图吗?(这是对企业的工作,用户数将是 最多100) 谢谢。

PS。我的第一个问题。 O.o

+0

你怎么知道哪个用户可以访问哪些记录?是由个人用户还是由他们属于哪个组?用户权限是否存储在任何地方? – DevDelivery 2011-12-23 15:04:40

+0

是的,他们存储。在UserRights表中。 User1 | 1001 User2 | 1002 User2 | 1003 User2 | 3000 – Control 2011-12-23 15:06:14

+0

您可以给出'code'表的模式吗?答案将是表格之间的连接。 – DevDelivery 2011-12-23 15:09:35

回答

3

您的访问标准似乎相当随意。 User1获得1001,user2获得1002,10033000,并且我假设用户3到99也具有任意访问权限。在这种情况下,我建议你创建一个表,把它useraccess这个例子:

user |accessID 
--------------- 
user1|1001 
user2|1002 
user2|1003 
user2|3000 
... |... 

现在,当你想知道用户所拥有的行,你可以这样做:

SELECT t.FromID, t.ToID, [[other columns you care about]] 
FROM yourtable t 
JOIN useraccess a ON t.FromID = a.accessID OR t.ToID = a.accessID 
WHERE a.user = 'user2' 

您可以动态运行该查询,也可以基于此创建视图。视图和直接查询之间的通常折衷将照常进行。

编辑︰我刚刚看到你的笔记,你已经有一个UserRights表,所以你已经完成了第1步。

+0

对不起,我不清楚。上面的解决方案是我正在使用的解决方案。但是 我有一些性能问题。所以,如果我为每个用户创建了不同的视图 那会更好还是更糟?我不确定 – Control 2011-12-23 15:12:59

+0

不,你不应该为每个用户创建一个视图。如果你在查询时遇到性能问题,我会说你需要检查你的索引。只要您的连接列被索引,300万行就不是那么多的数据。 – ean5533 2011-12-23 15:15:14

+1

每个用户视图只会保存'代码'表上的查找。这无助于性能,只会造成维修头痛。如果这个查询太慢,你可能需要添加两个索引,一个在FromId上,一个在ToId上。 – DevDelivery 2011-12-23 15:15:44