1

いくつかのテーブルからデータを選択するビューVがあります。また、ユーザーが表示できるV内のデータのタイプを定義するテーブルTもあります。

ユーザーにとって、Tにデータがない場合、それはビューVからすべてを表示できることを意味しますが、 Tにデータがある場合、ビューVの結果を制限する必要があります。

したがって、私の考えでは、V Left join TTif NothingまたはTV INNER JOIN Tでif somethingを実行する必要があります。

しかし、ビューVが実行するのにそれほど高速ではないクエリである可能性がある場合、このクエリをどのように記述して (サーバーの実行に関して) 可能な限り最高のパフォーマンスを得ることができるかはよくわかりません。最初に B からすべてを選択して、変数または一時テーブルに格納する必要がありますか? それとも、これまで聞いたことのない巧妙な SQL 構文を使用して、すべてを簡単に行うことができるでしょうか?

4

2 に答える 2

4

質問の「内部結合/外部結合」の部分に焦点を当てるのではなく、これを 2 つのステップで行うことをお勧めします。

まず、アプリケーションはテーブル「T」にクエリを実行して、ユーザーのアクセス権限を判断できます。次に、「T」のデータを使用して、ユーザーが「V」でアクセスできるものを決定します。

データベース レイヤーとビジネス レイヤーの両方を制御するサーバー アプリケーションを作成している場合は、最初にすべてのユーザーのアクセス許可設定を収集する手順を作成してから、2 つのクエリのいずれかを実行します。 Tの中身。

これをすべてデータレイヤーで行う必要がある場合は、次のようにします。

CREATE PROCEDURE myproc
    @current_user int
AS

-- Determine user's permission level
DECLARE @permission bit
SELECT @permission = permission FROM T WHERE t.user = @current_user

-- Use the appropriate query for this user
IF @permission IS NULL BEGIN
    SELECT * FROM V
END ELSE BEGIN
    SELECT * FROM V INNER JOIN T ON T.criteria=V.criteria
END
于 2012-08-20T17:36:03.607 に答える
2

これは、Tにすべての行を持つ「デフォルト」ユーザーがいる場合にのみ内部結合で実行できます。それ以外の場合は、次のようになります。

select V.*
from V,
T
where (v.id = T.Id 
AND T.User = current_user)
OR NOT EXISTS (select 1 from T where T.user=current_user)
于 2012-08-20T17:17:34.010 に答える