我有這個查詢,它將對支付和償還進行抵押。它的工作原理,但味道不好:在MySQL中沒有CTE有效地連接兩次相同的數據?
select P.pledgeID, P.decamount,
(
sum(coalesce(C1.decamount, 0)) - sum(coalesce(C2.decamount, 0))
) as paymentTotal
from Pledge P
left join (select C.*, CT.eaddOrSubtract
from `Payment` C
left join PaymentType CT on C.paymentTypeID = CT.paymentTypeID)
C1 on P.pledgeID = C1.pledgeID and C1.eaddOrSubtract = 'add'
left join (select C.*, CT.eaddOrSubtract
from `Payment` C
left join PaymentType CT on C.paymentTypeID = CT.paymentTypeID)
C2 on P.pledgeID = C2.pledgeID and C2.eaddOrSubtract = 'subtract'
group by pledgeID
特別,我覺得應該有更好的方式來處理joins
內joins
,特別是因爲它們產生相同的結果。在另一個RDBMS上,我會使用CTE,但在這裏不可用。有沒有更有效的方法來計算這些支付總額(考慮到一些是淨增加和其他淨減法的事實)?
架構信息:
PaymentType
---
| paymentTypeID | eaddOrSubtract | ...
| 1 | add |
| 2 | add |
| 3 | subtract |
| 4 | add |
| 5 | subtract |
Payment
---
| checkID | pledgeID | paymentTypeID | decamount | ...
| 1 | 19415 | 4 | 15.19 |
| 2 | 19414 | 2 | 900.00 |
| 3 | 19106 | 5 | 3856.00 |
| 4 | 19106 | 3 | 52.00 |
| 5 | 19414 | 1 | 15.00 |
是否可以使用表變量?有了這些,你可以獲得更快的連接,因爲表變量完全在內存中。你甚至可以索引這些。 – kurdy
請參閱:[爲什麼我應該爲我認爲是非常簡單的SQL查詢提供一個MCVE?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve -for-what-seems-to-what-seem-a-very-simple-sql-query) – Strawberry
「GROUP BY」子句中的列名應該更好地限定:「group by P.pledgeID」。它更清晰,例如SQLite要求。在MySQL中,它不是必需的,但它仍然更具可讀性。 – Palec