连接表上的子查询

时间:2012-10-12 08:24:41

标签: sql subquery

我正在撰写的查询需要一些帮助。我把它分解成最简单的形式。 我的表结构示例如下所示(为了清楚起见,我对其进行了更改):

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

一切运作良好。但是,我刚刚获悉,用户的所有直接报告都应该能够看到用户创建的文档和用户拥有的文档。

鉴于我已定义的示例表结构,我将如何用查询表达它?

非常感谢

1 个答案:

答案 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)