2016-08-18 5 views
0

나는이 절차를 가지고 있으며 날짜를 알려주는 자료와 몇 가지 다른 자료를 바탕으로 기록을 반환해야한다. 먼저 branch_ID를 임시 테이블 @branches에 놓은 다음 temp 테이블에서 해당 branch_ID를 선택하지만 선택 된 테이블뿐만 아니라 모든 분기에 대한 레코드도 반환합니다. 왜 ? 하지만 정적 Branch_ID 즉 3을 입력하면 그 지점이 선택됩니다. where 조건이 올바르게 작동하지 않는 이유는 무엇입니까?


그리고

... 
JOIN Statuses S ON S.StatusID = FE.Status_ID 
where fe.IsRejected=1 
AND EXISTS (
    SELECT * FROM vw_OrganizationTree v 
    WHERE v.BranchID = e.BranchID AND 
    (@Type = 1 and v.OrganizationID = @OfficeID) or 
    (@Type = 2 and v.CompanyID = @OfficeID) or 
    (@Type = 3 and v.BranchID = @OfficeID) 
    ) 
JaydipJ는 이유를 암시로 왜 현재 코드 ISN '

ALTER PROCEDURE [dbo].[usp_RejectedFiles] 
( 
@FromDate SMALLDATETIME, 
@ToDate SMALLDATETIME, 
@OfficeID INT=0, 
@Type INT=0 
) 
AS 
BEGIN 

DECLARE @Branches TABLE 
( 
BranchID INT 
) 

IF @Type = 1 
BEGIN 
INSERT INTO @Branches SELECT BranchID From vw_OrganizationTree WHERE OrganizationID = @OfficeID 
END 

IF @Type = 2 
BEGIN 
INSERT INTO @Branches SELECT BranchID From vw_OrganizationTree WHERE CompanyID = @OfficeID 

END 

IF @Type = 3 
BEGIN 
INSERT INTO @Branches SELECT BranchID From vw_OrganizationTree WHERE BranchID = @OfficeID 
END 

    SELECT C.CompanyName,B.BranchName,E.EmployerName,FE.EmployeeUniqueID,pcr.EmployerUniqueID, 
     FE.IncomeFixedComponent,FE.IncomeVariableComponent, 
     S.StatusDescription, FE.IsRejected, FE.ID 'EdrID' 
    From File_EdrEntries FE JOIN PAFFiles pe ON pe.ID = FE.PAFFile_ID 
    inner join File_PCREntries pcr on pe.ID=pcr.PAFFile_ID 
    JOIN Employers E ON E.EmployerID = pcr.EmployerUniqueID 
    JOIN Branches B ON B.BranchID = E.Branch_ID JOIN companies C ON C.COMPANYID = B.COMPANY_ID 
    JOIN Statuses S ON S.StatusID = FE.Status_ID 
    where fe.IsRejected=1 
    AND E.Branch_id = (Select Branch_ID from @Branches) 

END 
+0

샘플 데이터 및 테이블 정의를 게시해야합니다. – vercelli

답변

0

오히려이 임시 테이블을 사용하는 것보다, 당신은 단일 쿼리로 모든 것을 구성 할 수 있어야한다

AND E.Branch_id = (Select Branch_ID from @Branches) 

가,332에 Branch_ID라는 더 열이 없습니다 : 여기에 있기 때문에 t의 작업입니다 10 테이블. 따라서 외부 쿼리의 열에 대한 참조가됩니다 (둘 이상의 열이있는 경우 오류가 발생 함). 따라서 다음과 같이 효과적으로 나타납니다.

AND E.Branch_id = E.Branch_ID 

이렇게하면 모든 행이 반환됩니다. 따라서 하위 쿼리를 사용할 때는 접두사가 붙은 열 이름을 사용하는 것이 좋습니다. 이 :

AND E.Branch_id = (Select x.Branch_ID from @Branches x) 

존재하지 않는 열에 대한 오류가 발생했으며 작동하지 않는 이유에 대한 실마리가있었습니다.

1

참고 :이

열 이름 즉 열 이름의 문제점은 @Branches 테이블에 선언 오타되지 않았는지 확인하시기 바랍니다 것은 where 절에 사용되는 다릅니다.

열 이름

DECLARE @Branches TABLE 
( 
BranchID INT 
) 

테이블 @Branches과의 where 절

... 
AND E.Branch_id = (Select Branch_ID from @Branches) 

@Branches 테이블이 여러 행이있을 수 있으므로 대신 평등을 비교하면 EXISTS

IN를 사용해야 가능성이있을 수 있습니다
AND E.Branch_id IN (Select BranchID from @Branches) 
관련 문제