我认为你可以简化这个问题。如果我理解正确,您的支付取决于您的承诺(如果没有承诺,则没有支付)。如果这是真的,那么您可以执行以下操作:
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
一个棘手的解决方案,但它可能会对您有所帮助。