2016-08-18 20 views
0

私はこの手続きをしており、与えられた日付と他のほとんどの入力に基づいてレコードを返すべきです。まず、branch_IDをtempテーブルの@branchesに配置し、そのbranch_IDをtempテーブルから選択しますが、選択されたものだけでなく、すべてのブランチのレコードを返します。どうして ?しかし、静的な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

むしろ、この一時テーブルを使用するよりも、あなたは、単一のクエリにすべてを構成することができるはずですでBranch_IDと呼ばれる何の列がありません

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

:ここにいるのでトンの加工があります10テーブル。したがって、外部クエリの列への参照になります(複数の列がある場合は、エラーが発生します)。したがって、効果的には次のようになります。

AND E.Branch_id = E.Branch_ID 

これは、すべての行を返す理由です。このため、サブクエリを使用する場合は、接頭辞付きの列名を使用することをお勧めします。これは:

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

存在しない列についてのエラーを生成し、それが機能していなかった理由を示唆しましたか?

1

注:それは

where句で使用されるよりも@Branchesテーブルの列名すなわち列名宣言通報が異なるがタイプミスされていないことを確認してください。

列名

DECLARE @Branches TABLE 
( 
BranchID INT 
) 

テーブル@Branches INとでwhere句

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

@Branches表が複数の行を有することができるので、代わりに平等を比較するあなたはEXISTS

INを使用する必要があるという可能性があるかもしれません
AND E.Branch_id IN (Select BranchID from @Branches) 
関連する問題