2014-09-24 29 views
1

我需要返回一個普通用戶列表,其中檢查UserNames是否有權訪問一些widgetID。使用2個臨時表中的值返回普通用戶?

這對SQL Server 2008 R2使用SQL最好的做法如何?

UserNames in #DistinctUIDs table 
[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

WidgetIDs in #WidgetIDs table 
765 
768 
769 

Function: 
ufnGetWidgetsForUser (@UserName) 

我確保我只在每個臨時表中放置1列。我只需要在UserName上運行檢查來查看Function是否返回#widgetIDs表中的任何值,換句話說就是匹配。

例如(爲了邏輯起見)一個循環,檢查[email protected]是否可以訪問所有3個小部件。因爲他需要爲我重新分配小部件對其他用戶的所有權。

是否需要某種交叉連接?

+0

我不太明白 - 小部件如何綁定到用戶? – Siyual 2014-09-24 20:08:34

+0

@Siyual增加了更多解釋。如果要重新分配所有權,那麼需要在每個小部件上找到一個或多個這些用戶名作爲所有者,否則我無法重新分配。 – JoJo 2014-09-24 20:13:17

+0

您可以在問題中添加所需的結果嗎?我沒有看到你真正想要得到什麼。 – 2014-09-24 20:15:59

回答

2

讓我假設這是一個真正的問題:「我只需要在UserName上運行檢查來查看Function是否返回#widgetIDs表中的任何值,換句話說就是匹配。」

此外,讓我假設函數ufnGetWidgetsForUser (@UserName)是一個表值函數。

如果是這樣,我想你想cross apply,與其他一些檢查邏輯一起:

select distinct u.username 
from #DistinctUIDs u cross apply 
    dbo.ufnGetWidgetsForUser(u.username) as w(widgetId) 
where w.widgetId in (select widgetId from #WidgetIds); 

請注意,我使用in使用子查詢在這裏。這可能不是實現邏輯的最有效方式(join可能更好)。我這樣做是爲了分離查詢的兩部分:將函數應用於每個用戶名,然後根據列表檢查小部件。