2011-12-23 121 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