我有这个程序,它应该根据给出日期和其他一些输入返回记录。首先,它将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
答案 0 :(得分:1)
注意:请确认它不是拼写错误
@Branches
表中列名称,列名称声明的问题与where子句中使用的不同。
@Branches
表中的列名
DECLARE @Branches TABLE
(
BranchID INT
)
在where子句中
...
AND E.Branch_id = (Select Branch_ID from @Branches)
@Branches
表可能有多行,因此您应该使用IN
的{{1}}而不是比较相等性
EXISTS
答案 1 :(得分:0)
您应该能够将所有内容组合成单个查询,而不是使用此临时表:
...
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)
会产生关于不存在的列的错误,并给出了为什么它不起作用的线索。