2

ユニオンと派生テーブルの状況を含むストアド プロシージャがあります。ストアド プロシージャは、基本的に、最初のテーブル (したがって 2 番目) の基準を満たさないCases行を含め、すべての行を返す必要があります。Cases.AssnKey = AssnCtrl.pKey

私はこれに対していくつかのアプローチを試みました。最初に試してみると、基準を満たすすべての行が返されました。その後、顧客がすべてのケースを含めたいと考えていることを知りました。ある時点で、すべての行に加えCaseて、最初のテーブルの基準を満たす行の重複を返すバージョンがありました。2 番目のテーブルでは、重複を防ぐために最初のテーブルからレコードを除外しようとしています。

私は以下に到達しましたが、これは解析されますが、エラーがスローされます

「無効なオブジェクト名 'A'」.

入力パラメーターまたは宣言を含めませんでしたが、すべて正常に機能しています。どんな助けでも大歓迎です!

SELECT * 
FROM
   (SELECT 
       c.pKey, c.Name, c.LName, c.Balance, 
       SUM(cs.CAmount * @InterestRate * @DaysDiff) AS InterestAccrued, 
       ch.CollDesc, ac.Name AS AssociationName, (ac.IntrRate/100) AS IntrRate,
       SUM(CAmount) AS ChargeCodeBalance, c.MgmtKey,
       CASE c.PayPlanFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'
       END AS PayPlanFlg,
       CASE c.HoldFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'               
       END AS HoldFlg,
       CASE ac.AssmtChrgFreq
            WHEN 'D' THEN 'Daily'
            WHEN 'M' THEN 'Monthly'
            WHEN 'B' THEN 'Bi-monthly'
            WHEN 'Q' THEN 'Quarterly'
            WHEN 'A' THEN 'Annually'
            WHEN 'S' THEN 'Semi-annually'
            ELSE 'Unknown'
        END AS AssmtChrgFreq
    FROM Cases c 
    LEFT JOIN CaseSumm cs ON c.ClientKey = cs.ClientKey AND c.pKey = cs.CaseKey 
    INNER JOIN CollectHead ch ON c.ClientKey = ch.ClientKey AND ch.pKey = c.CollHeadKey 
    INNER JOIN AssnCtrl ac ON c.ClientKey = ac.ClientKey AND c.AssnKey = ac.pKey
    WHERE 
         c.ClientKey = @ClientKey
         AND c.AssnKey = @AssnKey   
         AND cs.TranCode IN (SELECT ChargeCode.RefNum.value('.', 'INT')
                             FROM @ChargeCodesXML.nodes('/chargecode/refnum') AS ChargeCode(RefNum))
        AND cs.TranDate >= @BeginDate 
        AND cs.TranDate <= @EndDate
        AND c.Active = 1
    GROUP BY c.pKey, c.Name, c.LName, c.Balance, ch.CollDesc, c.PayPlanFlg, c.HoldFlg, ac.Name, ac.IntrRate, ac.AssmtChrgFreq, c.MgmtKey) As A

    UNION       

    SELECT * FROM
    (SELECT c2.pKey, c2.Name, c2.LName, c2.Balance, 0 AS InterestAccrued, ch2.CollDesc, ac2.Name AS AssociationName, 0 AS IntrRate,
        0 AS ChargeCodeBalance, c2.MgmtKey,
        CASE c2.PayPlanFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'
        END
        AS PayPlanFlg,
        CASE c2.HoldFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'               
        END
        AS HoldFlg,
        CASE ac2.AssmtChrgFreq
            WHEN 'D' THEN 'Daily'
            WHEN 'M' THEN 'Monthly'
            WHEN 'B' THEN 'Bi-monthly'
            WHEN 'Q' THEN 'Quarterly'
            WHEN 'A' THEN 'Annually'
            WHEN 'S' THEN 'Semi-annually'
            ELSE 'Unknown'
        END
        AS AssmtChrgFreq
    FROM Cases c2 INNER JOIN CollectHead ch2
        ON c2.ClientKey = ch2.ClientKey
        AND ch2.pKey = c2.CollHeadKey INNER JOIN AssnCtrl ac2
        ON c2.ClientKey = ac2.ClientKey
        AND c2.AssnKey = ac2.pKey
    WHERE c2.ClientKey = @ClientKey
        AND c2.AssnKey = @AssnKey               
        AND c2.Active = 1
        AND c2.pKey NOT IN (SELECT pKey FROM A)
    GROUP BY c2.pKey, c2.Name, c2.LName, c2.Balance, ch2.CollDesc, c2.PayPlanFlg, c2.HoldFlg, ac2.Name, ac2.IntrRate, ac2.AssmtChrgFreq, c2.MgmtKey) As B           
4

1 に答える 1

0

最後に、(select pKey from A)UNIONの最初の部分のサブクエリからAを使用しようとしています。そこからはアクセスできません。これを行う方法は、AをCTEとして定義し、それに2回アクセスすることです。

ただし、Aは2回評価され、非常にまれな状況では、A's実際には2つがわずかに異なる可能性があることに注意してください。

;WITH A AS (
    SELECT 
       c.pKey, c.Name, c.LName, c.Balance, 
       SUM(cs.CAmount * @InterestRate * @DaysDiff) AS InterestAccrued, 
       ch.CollDesc, ac.Name AS AssociationName, (ac.IntrRate/100) AS IntrRate,
       SUM(CAmount) AS ChargeCodeBalance, c.MgmtKey,
       CASE c.PayPlanFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'
       END AS PayPlanFlg,
       CASE c.HoldFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'               
       END AS HoldFlg,
       CASE ac.AssmtChrgFreq
            WHEN 'D' THEN 'Daily'
            WHEN 'M' THEN 'Monthly'
            WHEN 'B' THEN 'Bi-monthly'
            WHEN 'Q' THEN 'Quarterly'
            WHEN 'A' THEN 'Annually'
            WHEN 'S' THEN 'Semi-annually'
            ELSE 'Unknown'
        END AS AssmtChrgFreq
    FROM Cases c 
    LEFT JOIN CaseSumm cs ON c.ClientKey = cs.ClientKey AND c.pKey = cs.CaseKey 
    INNER JOIN CollectHead ch ON c.ClientKey = ch.ClientKey AND ch.pKey = c.CollHeadKey 
    INNER JOIN AssnCtrl ac ON c.ClientKey = ac.ClientKey AND c.AssnKey = ac.pKey
    WHERE 
         c.ClientKey = @ClientKey
         AND c.AssnKey = @AssnKey   
         AND cs.TranCode IN (SELECT ChargeCode.RefNum.value('.', 'INT')
                             FROM @ChargeCodesXML.nodes('/chargecode/refnum') AS ChargeCode(RefNum))
        AND cs.TranDate >= @BeginDate 
        AND cs.TranDate <= @EndDate
        AND c.Active = 1
    GROUP BY c.pKey, c.Name, c.LName, c.Balance, ch.CollDesc, c.PayPlanFlg, c.HoldFlg, ac.Name, ac.IntrRate, ac.AssmtChrgFreq, c.MgmtKey
)
SELECT * 
FROM A

    UNION       

    SELECT * FROM
    (SELECT c2.pKey, c2.Name, c2.LName, c2.Balance, 0 AS InterestAccrued, ch2.CollDesc, ac2.Name AS AssociationName, 0 AS IntrRate,
        0 AS ChargeCodeBalance, c2.MgmtKey,
        CASE c2.PayPlanFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'
        END
        AS PayPlanFlg,
        CASE c2.HoldFlg
            WHEN 0 THEN 'No'
            WHEN 1 THEN 'Yes'               
        END
        AS HoldFlg,
        CASE ac2.AssmtChrgFreq
            WHEN 'D' THEN 'Daily'
            WHEN 'M' THEN 'Monthly'
            WHEN 'B' THEN 'Bi-monthly'
            WHEN 'Q' THEN 'Quarterly'
            WHEN 'A' THEN 'Annually'
            WHEN 'S' THEN 'Semi-annually'
            ELSE 'Unknown'
        END
        AS AssmtChrgFreq
    FROM Cases c2 INNER JOIN CollectHead ch2
        ON c2.ClientKey = ch2.ClientKey
        AND ch2.pKey = c2.CollHeadKey INNER JOIN AssnCtrl ac2
        ON c2.ClientKey = ac2.ClientKey
        AND c2.AssnKey = ac2.pKey
    WHERE c2.ClientKey = @ClientKey
        AND c2.AssnKey = @AssnKey               
        AND c2.Active = 1
        AND c2.pKey NOT IN (SELECT pKey FROM A)
    GROUP BY c2.pKey, c2.Name, c2.LName, c2.Balance, ch2.CollDesc, c2.PayPlanFlg, c2.HoldFlg, ac2.Name, ac2.IntrRate, ac2.AssmtChrgFreq, c2.MgmtKey) As B
于 2012-10-02T21:22:11.190 に答える