为什么这个SELECT花了2-3分钟,我怎么能把它减少到几秒钟?

Met*_*uru 0 sql oracle plsql

select to_date(checks.payment_dte, 'YYYYMMDD') as payment_date,
       checks.run_number, 
       checks.check_nbr as check_number, 
       checks.check_amt as check_amount, 
       checks.payee_no as payee_number, 
       checks.loc as location, 
       checks.fac_state as facility_state, 
       checks.delta_usa_ind, 
       checks.payee_lnme as payee_last_name, 
       checks.payee_fnme as payee_first_name, 
       checks.payee_addr1 as payee_address1, 
       checks.payee_addr2 as payee_address2, 
       checks.payee_addr3 as payee_address3, 
       checks.payee_city, 
       checks.payee_st as payee_state, 
       to_char(checks.payee_zip, '00000') as payee_zip,
       to_char(checks.payee_zip4, '0000') as payee_zip4, 
       checks.payee_country_cde as payee_country_code,
       country.country_abbreviation as payee_country_code_description, 
       checks.maint_code as maintenance_code, 
       checks.mod_dte as mod_date, 
       checks.mod_op, 
       checks.payment_profile_id, 
       checks.bank_profile_id, 
       checks.parent_id
from (select c.*, 
             check_total
      from db1.tbl_payment_checks c
      join (select sum(net) as check_total, 
                   check_nbr
            from (select nvl(sum(total_net),0) net, 
                         check_nbr
                  from db1.tbl_wip_hist_header
                  group by check_nbr
                  union all
                  select nvl(sum(refund_amount)*-1,0) net, 
                         check_number check_nbr
                  from db1.tbl_payment_refund_header
                  group by check_number)
            group by check_nbr) sums on (c.check_nbr = sums.check_nbr)
      where payee_no = '840932794'
      order by payment_dte desc) checks
left join db1.tbl_code_country country
             on (checks.payee_country_cde = country.country)
where rownum < 10
order by payment_dte desc
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 5

退出所有组by-s和子查询.你可以使用left joins和over子句来获得你想要的东西:

select to_date(checks.payment_dte, 'YYYYMMDD') as payment_date,
       checks.run_number, 
       checks.check_nbr as check_number, 
       checks.check_amt as check_amount, 
       checks.payee_no as payee_number, 
       checks.loc as location, 
       checks.fac_state as facility_state, 
       checks.delta_usa_ind, 
       checks.payee_lnme as payee_last_name, 
       checks.payee_fnme as payee_first_name, 
       checks.payee_addr1 as payee_address1, 
       checks.payee_addr2 as payee_address2, 
       checks.payee_addr3 as payee_address3, 
       checks.payee_city, 
       checks.payee_st as payee_state, 
       to_char(checks.payee_zip, '00000') as payee_zip,
       to_char(checks.payee_zip4, '0000') as payee_zip4, 
       checks.payee_country_cde as payee_country_code,
       country.country_abbreviation as payee_country_code_description, 
       checks.maint_code as maintenance_code, 
       checks.mod_dte as mod_date, 
       checks.mod_op, 
       checks.payment_profile_id, 
       checks.bank_profile_id, 
       checks.parent_id,
       sum(nvl(h.total_net, 0) + nvl(r.refund_amount,0)*-1) over (partition by checks.check_nbr) as check_total
from 
    db1.tbl_payment_checks checks
    left join db1.tbl_wip_hist_header h on
        checks.check_nbr = h.check_nbr
    left join db1.tbl_payment_refund_header r on
        checks.check_nbr = r.check_nbr
    left join db1.tbl_code_country country on 
        checks.payee_country_cde = country.country
where 
    rownum < 10
    and checks.payee_no = '840932794'
order by payment_dte desc
Run Code Online (Sandbox Code Playgroud)

那应该跑得快得多.