2014-09-24 31 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可能更好)。我这样做是为了分离查询的两部分:将函数应用于每个用户名,然后根据列表检查小部件。