繁体   English   中英

为什么条件无法正常工作?

[英]Why doesn't a where condition work correctly?

我有此过程,它应该根据给定日期和其他一些输入返回记录。 首先,它将一个branch_ID放置在临时表@branches中,然后从临时表中选择该branch_ID,但它不仅返回已选择的分支,还返回所有分支的记录。 为什么呢 但是,当我放静态Branch_ID即3时,它就选择了它。

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

注意:请确认不是错字

@Branches表中声明的列名(即列名)的问题与where子句中使用的问题不同。

@Branches表中的列名

DECLARE @Branches TABLE  
(  
 BranchID INT  
) 

在where子句中

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

可能有可能性@Branches表可有多行这样反而比较,你应该使用平等INEXISTS

AND E.Branch_id IN (Select BranchID from @Branches)

您应该能够将所有内容组合到一个查询中,而不是使用此临时表:

...
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所暗示的那样,您当前的代码不起作用的原因是因为:

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

没有所谓的列Branch_ID@Branches表。 因此,它成为对外部查询中一列的引用(如果存在多个这样的列,则将产生错误)。 因此,它实际上已成为:

AND E.Branch_id = E.Branch_ID

这就是为什么它返回所有行的原因。 这就是为什么在使用子查询时始终使用带前缀的列名始终是一个好主意的原因。 这个:

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

会产生有关不存在的列的错误,并提供线索说明为什么它不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM