1

私が書いているクエリについて少し助けが必要です。私はそれを最も単純な形に分解しました。私のテーブル構造の例を以下に示します(わかりやすくするために変更しました)。

Users
    UserId int -- PK Identity
    Username    varchar(30)

DirectReports
    DirectReportId  int -- PK Identity
    UserId int -- FK to Users.UserId
    ManagerId -- FK to Users.UserId

Documents
    DocumentId int -- PK Identity
    DocumentOwner int -- FK to Users.UserId
    DocumentName varchar(30)
    CreatedBy int -- FK to Users.UserId
    CreatedDate datetime

私がする必要があるのは、ドキュメントを作成したユーザーが自分のドキュメントを表示できるようにすることです。だから私は使用します:

CREATE PROCEDURE GetUsersDocuments
    @UserId         INT = null
AS
BEGIN

    SET NOCOUNT ON;

    Select * from Documents D
    Where D.CreatedBy = ISNULL(@UserId, D.CreatedBy)
END

これは、特定のユーザーによって作成されたすべてのドキュメントを返します。

ただし、モデルのビジネスルールでは、別のユーザーがユーザーに代わってドキュメントを作成することも規定されています。したがって、ユーザーは、自分で作成したすべてのレコードと、ユーザーが所有するすべてのドキュメントを表示する必要があります。

CREATE PROCEDURE GetUsersDocuments
    @UserId         INT = null
AS
BEGIN

    SET NOCOUNT ON;

    Select * from Documents D
    Where D.CreatedBy = ISNULL(@UserId, D.CreatedBy)
    OR D.DocumentOwner = ISNULL(@UserId, D.DocumentOwner)
END

すべてうまくいきます。ただし、ユーザーのすべての直属の部下は、ユーザーが作成したドキュメントとユーザーが所有権を持つドキュメントの両方を表示できる必要があると通知されました。

私が定義したテーブル構造の例を考えると、クエリの観点からこれをどのように表現しますか?

どうもありがとう

4

1 に答える 1

1
Select * from Documents D 
Where D.CreatedBy = ISNULL(@UserId, D.CreatedBy) 
    OR D.DocumentOwner = ISNULL(@UserId, D.DocumentOwner)  
    OR D.DocumentOwner = ( select ManagerID from DirectReports where @UserId = UserID)
于 2012-10-12T08:28:39.003 に答える