私が書いているクエリについて少し助けが必要です。私はそれを最も単純な形に分解しました。私のテーブル構造の例を以下に示します(わかりやすくするために変更しました)。
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
すべてうまくいきます。ただし、ユーザーのすべての直属の部下は、ユーザーが作成したドキュメントとユーザーが所有権を持つドキュメントの両方を表示できる必要があると通知されました。
私が定義したテーブル構造の例を考えると、クエリの観点からこれをどのように表現しますか?
どうもありがとう