我認爲你可以簡化這個問題。如果我理解正確,您的支出取決於您的承諾(如果沒有承諾,則不支付)。如果這是真的,那麼你可以做這樣的事情:
select
p.pl_no, p.pl_amount - sum(disb_amount) as balance
from
pledges as p
left join disbursements as d on p.pl_no = d.pl_no
group by
p.pl_no
having
p.pl_amount - sum(disb_amount) > 500;
如果您需要完整的信息(聯繫人,認捐和支出),那麼你必須認爲這是一個多步驟的問題:
- 首先需要的承諾的平衡
- 您需要的承諾
- 您需要的這個完整的信息相關聯的聯繫人記錄
所以,上面的查詢提供您所需要的步驟1中,您可以創建一個臨時表與該信息的信息:
Create temporary table temp_pledge_balance
select
p.pl_no, p.pl_amount - sum(disb_amount) as balance
from
pledges as p
left join disbursements as d on p.pl_no = d.pl_no
group by
p.pl_no;
我建議你這個指數表,加快後續步驟:
Alter table temp_pledge_balance
add index pl_no (pl_no);
現在,對於步驟2:
create temporary table temp_contacts
select c.*, p.pl_no
from
temp_pledge_balance as pb
inner join pledges as p on pb.pl_no=p.pl_no
inner join contacts as c on p.c_no = c.c_no;
alter temp_contacts
add index c_no(c_no);
最後,對於步驟3:
select
tc.*, pb.*, p.*, d.*
from
temp_contacts as tc
left join disbursements as d on tc.c_no = d.c_no
left join pledges as p on d.pl_no = p.pl_no
left join temp_pledge_balance as pb on p.pl_no = pb.p_no
where
pb.balance > 500
一個棘手的解決方案,但它可能會幫助你。
什麼表是'disb_amount'中的? – 2012-07-31 20:42:16