2014-08-31 35 views
1

我有兩個表。提高主程序細節SQL代碼性能

enter image description here

我需要的報告包括Payment1Payment2列名和支付的款項,但不得重複。

所以我寫這篇文章:

(
    SELECT Pid1, SUM(Payment1) as sum1, COUNT(*) as number, _name 
    FROM perform, Person 
    WHERE perform.Pid1= Person.id 
    GROUP BY _name, Pid1 
) 
UNION 
(
    SELECT Pid2, SUM(Payment2) as sum2, COUNT(*) as number, _name 
    FROM perform, Person 
    WHERE perform.Pid2= Person.id 
    GROUP BY _name, Pid2 
) 

輸出: Result: 此代碼的工作,但它的速度太慢。我怎麼能有更好的表現?

回答

1

你可以減少用戶通過移動union一個子查詢加盟person次數:

select pers.id 
,  perf_sum.sum_payment 
,  perf_sum.count_payment 
,  pers._name 
from (
     select pid 
     ,  count(*) as count_payment 
     ,  sum(payment) as sum_payment 
     from (
       select PID1 as pid 
       ,  Payment1 as payment 
       from perform 
       union all 
       select PID2 
       ,  Payment2 
       from perform 
       ) perf 
     group by 
       pid 
     ) perf_sum 
join person pers 
on  perf.pid = pers.id