Sql 如何使用IF EXISTS in join语句

Sql 如何使用IF EXISTS in join语句,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我想要使用的查询,如果存在于分类账表的左外部联接中将Exists移到Where子句 如果共享原始逻辑SUMAMOUNT*0,我确信可以简化此代码。如果在A子查询中没有BOOKCODE、MODE、ENTRYYEAR和ENTRYNO列,但在JOIN语句中使用了这些列,则可以简化此代码。如果不纠正这一点,就不可能重写您的查询。您是对的,我在一个已执行的查询中添加了fieldBOOKCODE、MODE、ENTRYYEAR和ENTRYNO列,@VR46 query提供的查询似乎工作得很好 SELECT

这是我想要使用的查询,如果存在于分类账表的左外部联接中

将Exists移到Where子句


如果共享原始逻辑

SUMAMOUNT*0,我确信可以简化此代码。如果在A子查询中没有BOOKCODE、MODE、ENTRYYEAR和ENTRYNO列,但在JOIN语句中使用了这些列,则可以简化此代码。如果不纠正这一点,就不可能重写您的查询。您是对的,我在一个已执行的查询中添加了fieldBOOKCODE、MODE、ENTRYYEAR和ENTRYNO列,@VR46 query提供的查询似乎工作得很好
SELECT 
    *
FROM 
    LEDGER AS LED 
LEFT OUTER JOIN
    (IF EXISTS(SELECT ACCOUNTCODE FROM B_C_J_TRANS WHERE ACCOUNTCODE = '001809' AND COMPANYCODE='RAM' --AND ENTRYNO='25' 
    AND MODE='J') 
        SELECT COMPANYCODE, SUM(AMOUNT * 0) AS AMOUNT
        FROM B_C_J_TRANS AS BCJTRANS
        WHERE (COMPANYCODE = 'RAM') AND (MODE = 'J') 
        GROUP BY COMPANYCODE
    ELSE
        SELECT COMPANYCODE, SUM( CASE WHEN BCJTRANS.ACCOUNTCODE = '800100' THEN BCJTRANS.AMOUNT ELSE 0 END) AS AMOUNT
        FROM B_C_J_TRANS AS BCJTRANS
        WHERE (COMPANYCODE = 'RAM')  AND (MODE = 'J')
        GROUP BY COMPANYCODE) AS A ON LED.COMPANYCODE = A.COMPANYCODE 
                                   AND LED.BOOKCODE = A.BOOKCODE 
                                   AND LED.[TYPE] = A.MODE 
                                   AND LED.FINANCIALYEAR = A.ENTRYYEAR 
                                   AND LED.VOUCHERNO = A.ENTRYNO 
WHERE 
    LED.COMPANYCODE = 'RAM' 
    AND LED.ACCCODE = '800100' 
    AND LED.VOUCHERDATE >= '2015-04-01' 
    AND LED.VOUCHERDATE <= '2015-05-31'
SELECT *
FROM   LEDGER AS LED
       LEFT OUTER JOIN (SELECT COMPANYCODE,
                               Sum(AMOUNT * 0) AS AMOUNT
                        FROM   B_C_J_TRANS AS BCJTRANS
                        WHERE  ( COMPANYCODE = 'RAM' )
                               AND ( MODE = 'J' )
                               AND EXISTS(SELECT ACCOUNTCODE
                                          FROM   B_C_J_TRANS
                                          WHERE  ACCOUNTCODE = '001809'
                                                 AND COMPANYCODE = 'RAM' --AND ENTRYNO='25' 
                                                 AND MODE = 'J')
                        GROUP  BY COMPANYCODE
                        UNION
                        SELECT COMPANYCODE,
                               Sum(CASE
                                     WHEN BCJTRANS.ACCOUNTCODE = '800100' THEN BCJTRANS.AMOUNT
                                     ELSE 0
                                   END) AS AMOUNT
                        FROM   B_C_J_TRANS AS BCJTRANS
                        WHERE  ( COMPANYCODE = 'RAM' )
                               AND ( MODE = 'J' )
                               AND NOT EXISTS(SELECT ACCOUNTCODE
                                              FROM   B_C_J_TRANS
                                              WHERE  ACCOUNTCODE = '001809'
                                                     AND COMPANYCODE = 'RAM' --AND ENTRYNO='25' 
                                                     AND MODE = 'J')
                        GROUP  BY COMPANYCODE)AS A
                    ON LED.COMPANYCODE = A.COMPANYCODE
                       AND LED.BOOKCODE = A.BOOKCODE
                       AND LED.[TYPE] = A.MODE
                       AND LED.FINANCIALYEAR = A.ENTRYYEAR
                       AND LED.VOUCHERNO = A.ENTRYNO
WHERE  LED.COMPANYCODE = 'RAM'
       AND LED.ACCCODE = '800100'
       AND LED.VOUCHERDATE >= '2015-04-01'
       AND LED.VOUCHERDATE <= '2015-05-31'