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 回答