2016-09-13 4 views
-1

テーブルを返すPostgresの関数を作成私はこの機能を持っている

CREATE OR REPLACE FUNCTION public.getusers(in user_id numeric) 
    RETURNS SETOF record 
AS 
$BODY$ 
    DECLARE 
    ids character varying; 
BEGIN 



CREATE or REPLACE TEMP VIEW test AS 
     SELECT fx.*,EXTRACT(epoch FROM fx.time -(fx.timebuffer::text||' minute')::INTERVAL)::DOUBLE PRECISION as startTime 
     ,EXTRACT(epoch FROM fx.time +(fx.timebuffer::text||' minute')::INTERVAL)::DOUBLE PRECISION as endTime 
     -- ... maybe more columns and expressions ... 
     FROM userlocation fx 
     ; 

CREATE or REPLACE TEMP VIEW buffer AS 
SELECT *,st_buffer(location,ul.buffer) as buffered from userlocation ul 
     ; 


RETURN QUERY (
select "UserInfo".username as uid,"UserInfo"."userID" as uname,"UserInfo".id as id from "UserInfo" , (

    (SELECT f1."userID"--,f1."ID" as locationID 
    FROM test f1 
    WHERE EXISTS(
     SELECT * 
     FROM test f2 
     WHERE numrange((f2.startTime) :: NUMERIC, (f2.endTime) :: NUMERIC) && 
      numrange((f1.startTime) :: NUMERIC, (f1.endTime) :: NUMERIC) 
      AND f2.locationtype = f1.locationtype 
      AND f2."userID"=user_id 
      AND f2.locationtype = 2) 
      -- AND f2."ID" <> f1."ID") 

    INTERSECT 

    SELECT u1."userID"--,u1."ID" 
    FROM buffer AS u1, 
    (SELECT * 
    FROM buffer ul) AS u2 
    WHERE st_intersects(u1.buffered, u2.buffered) = true 
     AND u1.locationtype = u2.locationtype 
     AND f2."userID"=user_id 
     AND u1.locationtype = 2) 
     -- AND u1."ID" <> u2."ID") 
    INTERSECT 

    (SELECT f3."userID"--,f3."ID" 
    FROM test f3 
    WHERE EXISTS(
     SELECT * 
     FROM test f4 
     WHERE numrange((f4.startTime) :: NUMERIC, (f4.endTime) :: NUMERIC) && 
      numrange((f3.startTime) :: NUMERIC, (f3.endTime) :: NUMERIC) 
      AND f4.locationtype = f3.locationtype 

    AND f2."userID"=user_id 
      AND f4.locationtype = 1) 
      -- AND f4."ID" <> f3."ID") 

    INTERSECT 

    SELECT u3."userID"--,u3."ID" 
    FROM buffer AS u3, 
    (SELECT * 
    FROM buffer ul) AS u4 
    WHERE st_intersects(u3.buffered, u4.buffered) = true 
     AND u3.locationtype = u4.locationtype 

    AND f2."userID"=user_id 
     AND u3.locationtype = 1) 
     -- AND u3."ID" <> u4."ID") 

) inter WHERE inter."userID"="UserInfo".username); 
    --Some code which build the ids string, not interesting for this issue 

    -- RETURN QUERY EXECUTE 'SELECT users.id, users.firstname, users.lastname 
    -- FROM public.users WHERE ids IN (' || ids || ')'; 






END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 

私はRETURN QUERY(....)でクエリ部分を実行したときに私のテーブルを与えることになって、このクエリは、それがうまく動作しますが、私はこの機能を実行すると、それは私が間違っているの

ERROR: missing FROM-clause entry for table "f2" 
    Where: PL/pgSQL function getusers(numeric) line 20 at RETURN QUERY 

私は、このエラーが発生します?あなたは、問題を見つける私を助けてくださいことができますか? おかげで第二に

+1

最初のINTERSECTの後には、 "userID"がありますが、利用できるのはu1 en u2のみです。 – Eelke

+0

@Eelkeあなたの答えのおかげで、なぜ、私はエラーを与えていないPostqlのSQLウィンドウからコードを実行するとき? –

答えて

1

、あなたがそこに表示されていないWHERE一部のテーブルf2からフィールドにアクセスしようとしているあなたのINTERSECTクエリの第3および第4の部分。

u1."userID" = user_id -- second 
f3."userID" = user_id -- third 
u3."userID" = user_id -- fourth 
+0

ありがとう、しかし、私はそれを関数に変換する前に、このクエリはよく実行されます –

+0

あなたのすべてのクエリは別々であり、私は正直なところそれを信じていません。サンプルデータを入力し、関数を[sql fiddle script](http://sqlfiddle.com/)に実行するのに必要なテーブルを作成し、さらに調査するためにリンクを共有してください。 –

+0

wow.これは私の間違いでした。私はこれらの行をクエリに追加して固定しませんでした。今すぐ動作します。 –

関連する問題