我正在撰写的查询需要一些帮助。我把它分解成最简单的形式。 我的表结构示例如下所示(为了清楚起见,我对其进行了更改):
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
一切运作良好。但是,我刚刚获悉,用户的所有直接报告都应该能够看到用户创建的文档和用户拥有的文档。
鉴于我已定义的示例表结构,我将如何用查询表达它?
非常感谢
答案 0 :(得分: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)