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 调用,这是我想要的主要内容。
我有以下查询需要提高性能。最大的问题是它多次调用同一个 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 调用,这是我想要的主要内容。