0

私は2つのテーブルを持っています.1つは一連のIDを持ち、もう1つは次のように一連の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 = 2 と仮定します。

id
---
3
4
6
7
9
11

ユーザー ID = 13 と仮定します。

id
---
3
6
7
11

4 と 9 は、それぞれユーザー 2 と 3 に制限されているためです。

4

3 に答える 3

1

編集:私の再読に基づいて、ロジックの私の理解は次のとおりです。UserIDがビジネステーブルにある場合はすべてのクライアントを返し、それ以外の場合はビジネステーブルに存在しないすべてのクライアントを返します。

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
于 2012-04-10T17:22:36.353 に答える
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
于 2012-04-10T17:30:55.137 に答える
0

私の質問の解釈に基づいて、これがあなたが望む質問だと思います。

クエリの機能についてのわかりやすい英語の説明は次のとおりです。すべてのクライアントのリストから、Businessテーブルによって制限されているクライアントを削除します。次に、ユーザーが明示的にアクセスできるクライアントのリストを追加します。

declare @userid int =5 
(
 select Id from Client 
 except
 select clientId from Business 
)
union 
select clientId from Business where userId = @userId
于 2012-04-10T17:35:32.353 に答える