2012-04-10 20 views
0

で望ましい結果を考え出すための最良の方法は、1は、IDのセットを持っており、次のように他の一つはIDのセットとユーザーIDを持っている私は2つのテーブルを持って、このクエリ

クライアント

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

ビジネス

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

だから、基本的に私は@use @userIdにしている場合くるパラメータを持っていますたとえば、rId = 2とすると、そのユーザーはClientIdテーブルにあるclientId 4と9とその他すべてのアクセス権を持ちますが、@userId = 5と言うと、このユーザーはビジネステーブルでの制限があるため、クライアントID 4と9にアクセスできません。クライアント2と3だけです。

私の望む結果は、ユーザーが見ることができるすべてのクライアントIDのリストです(ただし、ビジネステーブルにユーザーIDが指定されていて、そのユーザーIDがそこにない場合、そのユーザーIDは、クライアント表を照会するときにビジネス表のクライアントIDを見ることができません。

私はとても混乱しています。申し訳ありませんが、私はこの1つを思いつくのに苦労しています。どんな指針も高く評価されます。

結果は、4と9は、それぞれユーザ2及び3に制限されているため、ユーザーID = 2

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

=ユーザIDを想定

を想定しなければなりません。

+1

ユーザーID5が渡された場合、ClientID3,6,7,11を確認できるはずです。 –

+0

うわー - この質問は意味をなさない。あなたが何をしたいのかを説明するためのデータをもっと提供してください – Bohemian

+0

うーむ - 私の次の再読み込み時に、彼らがビジネステーブルにいるかのように聞こえますが、リンクされているClientIDは問題ではありません。 * all ** Clients:* "たとえば、@userId = 2の場合、そのユーザーはClientIdテーブルにあるclientId 4と9 **とその他すべての**にアクセスできます" *これを考慮に入れて私の答えを編集する。 –

答えて

1

編集:私の再考に基づいて、論理を理解します。戻り値すべて UserIDがBusinessテーブルにある場合はクライアント、それ以外の場合は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
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 –

0

私はこれがあなたの質問の私の解釈に基づいてするクエリであると考えています。

ここでは、クエリの機能について簡単に説明します。すべてのクライアントのリストから、ビジネステーブルで制限されているクライアントを削除します。その後、ユーザーが明示的にアクセスできるクライアントのリストを追加します。

declare @userid int =5 
(
select Id from Client 
except 
select clientId from Business 
) 
union 
select clientId from Business where userId = @userId 
関連する問題