在此查询中提供所需结果的最佳方法

时间:2012-04-10 17:17:52

标签: sql sql-server-2008

我有两个表,一个有一组id,另一个有一组id和一个用户ID,如下所示

客户端

     id
  -----
    3
    4
    6
    7
    9
    11

商家

ClientId  |     userId
----------------------
 4            2
 4            3
 9            2

所以基本上我会在@userId中有一个参数,如果@userId = 2,那么该用户可以访问clientId 4和9以及ClientId表中的所有其他参数但是如果说@userId = 5,这个用户无法访问客户端ID 4和9,因为它们在业务表中仅限于客户端2和3。

我的愿望结果是用户可以看到的所有客户端ID的列表(但必须检查如果在业务表中指定了用户ID并且用户ID不是那些用户ID,则该用户ID无法看到查询客户端表时,业务表中的客户端ID。

我很抱歉这太令人困惑了......我很难想出这个......任何指针都会非常感激。

结果应为

假设用户ID = 2

id
---
3
4
6
7
9
11

假设用户ID = 13

id
---
3
6
7
11

因为4和9分别仅限于用户2和3。

3 个答案:

答案 0 :(得分:1)

编辑:基于我的重新阅读,我对逻辑的理解是:如果UserID在Business表中,则返回所有客户端,返回业务中不存在的所有客户端除此之外。

IF EXISTS (SELECT ClientId FROM Business WHERE UserId = @userId)
BEGIN
  SELECT DISTINCT Id
  FROM Client
END
ELSE
BEGIN
  SELECT Id
  FROM Client
  WHERE Id NOT IN
  (
    SELECT DISTINCT ClientId
    FROM Business
  )
END

答案 1 :(得分:1)

select DISTINCT ID from Client C
left join Business B on C.ID = B.ClientID
Where B.ClientID is null OR B.UserID = @UserID

答案 2 :(得分:0)

我认为根据我对您问题的解释,这是您想要的查询。

以下是查询功能的简明英文说明:从所有客户端列表中删除受Business表限制的客户端。然后添加用户具有显式访问权限的客户端列表。

declare @userid int =5 
(
 select Id from Client 
 except
 select clientId from Business 
)
union 
select clientId from Business where userId = @userId