[英]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
表可有多行这样反而比较,你应该使用平等IN
的EXISTS
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.