1

私はSQLの初心者で、この質問の解き方がわかりません。次の SQL クエリとストアド プロシージャを 1 つの SQL クエリに結合する方法。これは PostgreSQL クエリおよび関数です。どんな助けでも大歓迎です。

次のクエリは、クエリの値ごとにストアド プロシージャ/関数を呼び出します。

 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;

クエリとストアド プロシージャを 1 つの SQL クエリにマージする方法を教えてください。

4

2 に答える 2

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 

関数呼び出しを囲む括弧に注意してください。
また、簡略化された等結合条件 ( USING) を使用して適切な ANSI JOIN 構文を使用するようにクエリを書き直し、誤った大文字を削除しました。

于 2013-03-11T07:38:23.047 に答える
0

それらをマージしないでください。これが基本的な答えです。コードが関数内にある目的の 1 つは、複数のクエリから呼び出して 1 か所で管理できるようにすることです。クエリが各反復で既に関数を呼び出している場合、2 つをマージしても意味がありません。

コードを移動するだけでは何のプラスにもならないので、これを行うことで何を期待できますか?

実際、他のクエリがそれを使用している場合、それを削除すると壊れます。

于 2013-03-10T01:53:08.477 に答える