2013-03-10 92 views
1

我是SQL初學者,我不知道如何解決這個問題。如何將以下SQL查詢和存儲過程合併爲一個SQL查詢。這是一個PostgreSQL查詢和函數。任何幫助表示讚賞。將存儲過程和SQL查詢組合到一條SQL語句中

下面的查詢要求查詢的每個值的存儲過程/函數:

SELECT t.trj_id, T2.trj_id, Similar_trj_woffset(t.trj_id, T2.trj_id) 
FROM transitions T1, 
     transitions T2 
WHERE T1.w_s = T2.w_s 
AND T1.w_e = T2.w_e 
AND T1.trans_id <> T2.trans_id 

存儲過程/函數是:

create or replace function similar_trj_woffset(
    IN t1 as integer, 
    IN t2 as integer, 
    OUT score as integer, 
    OUT offset as integer 
) AS $$ 
declare 
off_set integer :=0; 
score integer := 0; 
cou integer; 
time1 integer; 
time2 integer; 
dist integer; 
begin 
for off_set in 0..10 LOOP 
     time1 := 0; 
     time2 := 0 + off_set; 
     cou := 0; 
     while time2 < 100 Loop 
      select vec_length(P.x-P2.x,P.y-P2.y,P.z-P2.z) into dist 
      from AtomPositions P, AtomPositions P2 
      where P.trj_id = t1 
      and P2.trj_id = t2 
      and P.t = time1 
      and P2.t = time2; 
     if dist < cuto`enter code here`ff then 
      cou : = cou + 1; 
     time1 := time1 + 1; 
     time2 := time2 + 1; 
    end loop 
    if cou > score then 
     score := cou ; 
     offset := off_set; 
    end if; 
    off_set := off_set + 1; 
end loop; 

end $$ language plpgsql; 

有人能告訴我如何合併查詢和存儲過程合併爲一個SQL查詢。

+1

爲什麼你需要它? – shibormot 2013-03-10 01:03:30

+0

我想合併它以便查詢優化。 – navin 2013-03-10 02:23:20

回答

0

你不應該合併它們是你的基本答案。代碼在函數中的一個目的是可以從多個查詢中調用並保存在一個地方。當查詢已經在每次迭代中調用函數時,將兩者合併是沒有意義的。

你期望從這樣做中獲得什麼,因爲簡單地移動代碼不會做任何積極的事情?

實際上,如果有任何其他查詢使用它,它們會中斷,如果你刪除它。

+0

只有這個查詢使用了這個函數,爲了查詢優化我想合併它們。 – navin 2013-03-10 02:24:03

1

調用此函數的分裂返回的記錄分到各個欄目:

SELECT t.trj_id, t2.trj_id, (similar_trj_woffset(t.trj_id, t2.trj_id)).* 
FROM transitions t1 
JOIN transitions t2 USING (w_s, w_e) 
WHERE t1.trans_id <> t2.trans_id 

注意周圍的函數調用的括號。
我還重寫了查詢以使用適當的ANSI JOIN語法和簡化的等效條件(USING),並刪除了虛假的上層外殼。