SQL 查询消除多个 Table 相同的调用 Table

SQL Query Eliminate Multiple Table Calls of Same Table

我有以下查询需要提高性能。最大的问题是它多次调用同一个 table,我正在尝试看看是否有更好的方法来执行它。

SELECT tc.chargesID
      ,p1.payerID as paymentPlan_Payer_1
      ,p2.payerID as paymentPlan_Payer_2
      ,p3.payerID as paymentPlan_Payer_3
      ,p4.payerID as paymentPlan_Payer_4
FROM TableCharges tc
LEFT JOIN Sales_Enc se ON c.chargesID  = se.salesencounterID

LEFT JOIN Sales_Enc_Payer sep1 ON sep.salesencounterID = se.salesencounterID and sep.salesCode = 1
LEFT JOIN Sales_Enc_Payer sep2 ON sep.salesencounterID = se.salesencounterID and sep.salesCode = 2
LEFT JOIN Sales_Enc_Payer sep3 ON sep.salesencounterID = se.salesencounterID and sep.salesCode = 3
LEFT JOIN Sales_Enc_Payer sep4 ON sep.salesencounterID = se.salesencounterID and sep.salesCode = 4

LEFT JOIN payer p1 ON sep1.payerID = p1.payerID
LEFT JOIN payer p2 ON sep2.payerID = p2.payerID
LEFT JOIN payer p3 ON sep3.payerID = p3.payerID
LEFT JOIN payer p4 ON sep4.payerID = p4.payerID

让我知道你们的想法。

与@Charlieface 所说的一致,尝试只加入 Sales_Enc_Payer 一次,并将 salesCode = 1 加入过滤器移动到与相应付款人的加入 table 像这样的实例...

SELECT
          tc.chargesID
        , p1.payerID AS paymentPlan_Payer_1
        , p2.payerID AS paymentPlan_Payer_2
        , p3.payerID AS paymentPlan_Payer_3
        , p4.payerID AS paymentPlan_Payer_4
FROM      TableCharges    tc
LEFT JOIN Sales_Enc       se ON tc.chargesID          = se.salesencounterID
LEFT JOIN Sales_Enc_Payer sep ON sep.salesencounterID = se.salesencounterID
LEFT JOIN payer           p1 ON sep.payerID           = p1.payerID
                            AND sep.salesCode         = 1
LEFT JOIN payer           p2 ON sep.payerID           = p2.payerID
                            AND sep.salesCode         = 2
LEFT JOIN payer           p3 ON sep.payerID           = p3.payerID
                            AND sep.salesCode         = 3
LEFT JOIN payer           p4 ON sep.payerID           = p4.payerID
                            AND sep.salesCode         = 4;

我就是无法释怀。这就是你解决这个问题的方法。

SELECT tc.chargesID, 

MAX(CASE WHEN sep1.salesCode = 1 THEN p1.payerID ELSE NULL END) as paymentPlan_Payer_1, 
MAX(CASE WHEN sep1.salesCode = 2 THEN p1.payerID ELSE NULL END) as paymentPlan_Payer_2, 
MAX(CASE WHEN sep1.salesCode = 3 THEN p1.payerID ELSE NULL END) as paymentPlan_Payer_3, 
MAX(CASE WHEN sep1.salesCode = 4 THEN p1.payerID ELSE NULL END) as paymentPlan_Payer_4

FROM TableCharges tc

LEFT JOIN Sales_Enc se ON c.chargesID  = se.salesencounterID

LEFT JOIN Sales_Enc_Payer sep1 ON sep.salesencounterID = se.salesencounterID and sep.salesCode IN (1,2,3,4)

LEFT JOIN payer p1 ON sep1.payerID = p1.payerID

GROUP BY tc.chargesID

现在我得到了我正在寻找的行。我设法消除了多次 table 调用,这是我想要的主要内容。