2012-10-12 44 views
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 

所有工作都很好。但是,我剛剛被告知,用戶的所有直接報告都應該能夠看到由用戶創建的兩個文檔以及用戶擁有的文檔。

鑑於我已經定義了示例表結構,我將如何用查詢來表達這個結構?

非常感謝

回答

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)