2012-09-28 26 views
0

我有以下模式甲骨文相关子查询的问题

Invoices 
================= 
invoice_number 
account_id 
invoice_amount 
invoice_date 
status ("Paid","Not Paid") 

我想写一个查询来获取所有发票以下信息...

  • 发票号
  • 发票日期
  • 帐号ID
  • 发票金额
  • 此帐户ID的最后一笔付款金额(在此行的发票日期之前)

我对最后一个项目(最后支付的发票金额)有问题。到目前为止,我有...

select 
inv2.invoice_number, 
inv2.invoice_date, 
inv2.account_id, 
inv2.invoice_amount, 
(
select * from (
    select inv.invoice_amount 
     from invoices inv 
     where inv.account_id = inv2.account_id 
     and inv.status = 'PAID' 
     and inv.invoice_date < inv2.invoice_date 
     order by inv.invoice_date desc 
    ) 
where rownum <=1 
) as last_paid_amount 
from 
invoices inv2 

我试图重构这个不使用相关子查询,因为我的数据集的大小使得这个非常昂贵的。我如何重构使用不相关的子查询。这甚至有可能吗?

谢谢

回答

1

我可能搞砸order by条款在这里,因为我没有机会,现在对其进行测试,但这个想法是使用LAG功能:

select 
    inv2.invoice_number, 
    inv2.invoice_date, 
    inv2.account_id, 
    inv2.invoice_amount, 
    lag(invoice_amount) over(
    partiton by account_id 
    order by invoice_date, decode(status, 'PAID', 1, 0) 
) last_paid_amount 
from 
invoices inv2