将存储过程和SQL查询合并为一个SQL语句

时间:2013-03-10 00:49:59

标签: sql postgresql plpgsql

我是SQL的初学者,我不知道如何解决这个问题。如何将以下SQL查询和存储过程组合到单个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;

有人可以告诉我如何将查询和存储过程合并到一个SQL查询中。

2 个答案:

答案 0 :(得分: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)并删除了虚假的上壳。

答案 1 :(得分:0)

你不应该合并它们是你的基本答案。代码在函数中的一个目的是可以从多个查询中调用它并在一个地方维护。当查询已经在每次迭代时调用函数时,合并这两者是没有意义的。

你期望从中获得什么,因为只是移动代码不会做任何积极的事情?

实际上,如果有任何其他查询使用它,如果你删除它们就会中断。