2012-04-10 13 views
0

預期的結果,最好的辦法我有兩個表一個有一組ID的,另一個有一組ID和用戶ID如下拿出在此查詢

客戶

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

業務

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

所以基本上我將在@userId如果@use未來參數例如,rId = 2,則該用戶可以訪問ClientId 4和9以及ClientId表中的所有其他用戶,但如果說@userId = 5,則此用戶無法訪問客戶端ID 4和9,因爲它們在業務表中受到限制只有客戶端2和3.

我的願望結果是用戶可以看到的所有客戶端ID的列表(但必須檢查,如果用戶標識在業務表中指定,並且用戶標識不是那些那些,在查詢客戶表時,該用戶標識無法在業務表中看到客戶標識。

我很抱歉,這是如此令人困惑..我很難與這個一起..任何指針將不勝感激。

結果應該是

假設用戶ID = 2

id 
--- 
3 
4 
6 
7 
9 
11 

假設用戶ID = 13

id 
--- 
3 
6 
7 
11 

由於4和9分別限制爲用戶2和3 。

+1

只是澄清 - 如果傳入userId 5,他們應該能夠看到ClientIDs 3,6,7和11? – 2012-04-10 17:20:12

+0

哇 - 這個問題沒有道理。提供更多的數據來說明你想要做什麼 – Bohemian 2012-04-10 17:28:41

+0

嗯 - 在我下一次重讀時,聽起來像只要他們在商業表中,他們鏈接到哪個ClientID並不重要,他們得到* *全部**客戶端:*「如果@ userId = 2例如那麼該用戶有權訪問clientId 4和9 **以及ClientId表中的所有其他用戶**」*編輯我的答案以考慮到這一點。 – 2012-04-10 17:31:09

回答

1

編輯:根據我再讀取,我的邏輯的理解是這樣的:返回所有客戶端如果用戶名是在業務表,返回不業務表中已經存在,否則所有客戶端。

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
select DISTINCT ID from Client C 
left join Business B on C.ID = B.ClientID 
Where B.ClientID is null OR B.UserID = @UserID 
+0

我認爲這是比我剛發佈的更好的解決方案。它更簡單,可能也會有更好的表現。好的工作@amit_g – 2012-04-10 17:38:23

0

我相信這是你根據我對你的問題的解釋想查詢。

以下是對查詢所做的簡單英語說明:從所有客戶端列表中刪除受Business表限制的客戶端。然後添加用戶明確訪問的客戶端列表。

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