Sql server 2005 从sql查询中避免子查询

Sql server 2005 从sql查询中避免子查询,sql-server-2005,Sql Server 2005,我有这样一个问题: SELECT emppayslipgenerationdetails.EMPpayslipgenerationdetailid, emppayslipgenerationdetails.MonthNumber , emppayslipgenerationdetails.YearNumber , emppayslipgenerationdetails.FinancialY

我有这样一个问题:

SELECT emppayslipgenerationdetails.EMPpayslipgenerationdetailid,
       emppayslipgenerationdetails.MonthNumber                 ,
       emppayslipgenerationdetails.YearNumber                  ,
       emppayslipgenerationdetails.FinancialYearID             ,
       emppayheadvalues.PayHeadMasterID                        ,
       emppayheadvalues.PayHeadValue                           ,
       ISNULL(
       ( SELECT  SUM(EPH.PayHeadValue) AS YTD
       FROM     emppayheadvalues EPH
       WHERE    EPH.EmppayslipgenerationdetailID<=emppayslipgenerationdetails.EMPpayslipgenerationdetailid
       AND      EPH.PayHeadMasterID              =emppayheadvalues.PayHeadMasterID
       AND      EmppayslipgenerationdetailID IN
                (SELECT EmppayslipgenerationdetailID
                FROM    emppayslipgenerationdetails
                WHERE   FinancialYearID=2
                AND     EmpNumber      ='E0012'
                )
       GROUP BY PayheadMasterID
       )
       ,0)AS YTD
FROM   emppayheadvalues
       INNER JOIN emppayslipgenerationdetails
       ON     emppayheadvalues.EMPpayslipgenerationdetailid= emppayslipgenerationdetails.EMPpayslipgenerationdetailid
WHERE  emppayslipgenerationdetails.empnumber               ='E0012'
AND    emppayslipgenerationdetails.FinancialYearID         =2

如何删除影响性能的子查询

消除子查询的一般方法是使用join

为了证明这一点,为了消除最内部的查询,您应该尝试以下方法:

   SELECT   SUM(EPH.PayHeadValue) AS YTD
   FROM     emppayheadvalues EPH
   JOIN     emppayslipgenerationdetails
   WHERE    EPH.EmppayslipgenerationdetailID<=emppayslipgenerationdetails.EMPpayslipgenerationdetailid
   AND      EPH.PayHeadMasterID              =emppayheadvalues.PayHeadMasterID
   AND      EmppayslipgenerationdetailID     =emppayslipgenerationdetails.EmppayslipgenerationdetailID
   AND      EmpNumber                        ='E0012'
   AND      emppayslipgenerationdetails.FinancialYearID=2
   GROUP BY PayheadMasterID
但是请注意,在某些情况下,这可能比子查询更昂贵