2011-05-08 141 views
3

我有這個醜陋的查詢....重用查詢結果子查詢

sum(CASE 
     WHEN effective_from_date < '2011-05-24' THEN (rate * (effective_to_date - '2011-05-24' + 1)) 
     WHEN effective_to_date > '2011-05-28' THEN (rate * ('2011-05-28' - effective_from_date + 1)) 
     ELSE (rate * (effective_to_date - effective_from_date + 1)) 
    END 
    ) as price_cal_rate 
     FROM calendar_event 
     WHERE property_rid = (SELECT rid FROM property WHERE web_id = 'T28314') AND 
     ((effective_from_date BETWEEN '2011-05-24' AND '2011-05-28') OR (effective_to_date BETWEEN '2011-05-24' AND '2011-05-28')) 
     AND 
     NOT EXISTS (

     SELECT days_diff FROM (


     SELECT ((effective_from_date - lag(effective_to_date) OVER (PARTITION BY NULL ORDER BY effective_from_date ASC))) AS days_diff, effective_from_date, effective_to_date 
      FROM calendar_event 
      WHERE property_rid = (SELECT rid FROM property WHERE web_id = 'T28314') AND 
     ((effective_from_date BETWEEN '2011-05-26' AND '2011-05-28') OR (effective_to_date BETWEEN '2011-05-26' AND '2011-05-28')) 


     ) AS t WHERE COALESCE(days_diff, 0) > 1 

     ) AND EXISTS (select * from (
      select min(effective_from_date) as min_date, max(effective_to_date) as max_date FROM calendar_event 
     WHERE property_rid = (SELECT rid FROM property WHERE web_id = 'T28314') AND 
     ((effective_from_date BETWEEN '2011-05-24' AND '2011-05-28') OR (effective_to_date BETWEEN '2011-05-24' AND '2011-05-28')) 
     ) as max_min WHERE min_date <= '2011-05-24' and max_date >= '2011-05-28') 

查詢被計算在日期範圍率....查詢是好的......但有一個很多查詢重複....我想知道是否有存儲該子查詢的地方

FROM calendar_event 
     WHERE property_rid = (SELECT rid FROM property WHERE web_id = 'T28314') 
AND 
      ((effective_from_date BETWEEN '2011-05-24' AND '2011-05-28') OR (effective_to_date BETWEEN '2011-05-24' AND '2011-05-28')) 

的結果,並用它在我的查詢的好辦法....

+1

這可能是什麼工作,但它是值得一試。 pgsql非常擅長於在運行時優化看起來像是一次重複的重複。我肯定會比較這兩個查詢的解釋分析輸出,以查看當您創建臨時表或使用WITH子句時是否更快。查找與,它幾乎沒有被製作成您所查詢的表中的臨時表 – 2011-05-08 14:28:20

回答

5

你可以使用臨時表作爲「畝太短」的建議泰德但如果你只需要在一個單一的「主」的查詢結果,你使用PostgreSQL 8.4或更高版本,你也可以使用with queries

+0

非常感謝球員 – Rob 2011-05-08 07:18:08