2012-10-12 5 views
1

필자가 작성한 쿼리에 약간의 도움이 필요합니다. 나는 그것을 가장 간단한 형태로 분해했다. 내 테이블 구조의 예는 다음과 같습니다 (I는 명확성을 위해 그것을 변경 한) :하위 쿼리에서 조인 된 테이블

내가해야 할 일은
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) 
관련 문제