2016-11-01 77 views
0

明白なエラーを見てもそれを見つける機会はありません。私は、この関数でエラーをローカライズするために作られました:PostgreSQL:サブクエリは1つのカラムを返さなければなりません

CREATE TYPE questionObject AS (
    id BIGINT, 
    body VARCHAR, 
    author_id BIGINT, 
    category_id BIGINT, 
    urgent BOOLEAN, 
    created_at TIMESTAMP, 
    locale_id BIGINT, 
    lat DOUBLE PRECISION, 
    lng DOUBLE PRECISION, 
    radius INTEGER 
); 

そして、私はこの実行時にエラーになっています:私のタイプと

Error: subquery must return only one column 
+0

あなたは、実際には、2つのクエリを持っています。別々に試しましたか?どちらがエラーを引き起こしていますか? – FDavidov

+0

良い通知私を試してみましょう – Lazyexpert

+0

問題は最初のクエリにあります.... – Lazyexpert

答えて

1

をこのタイプを使用しています

CREATE OR REPLACE FUNCTION findRecipientsByQuestion(questionId BIGINT) 
RETURNS SETOF BIGINT AS $$ 
DECLARE 
    question questionObject; 

    BEGIN 
    question := (
     SELECT "a"."id", "a"."body", "a"."author_id", "a"."category_id", "a"."urgent", "a"."created_at", "a"."locale_id", "a"."lat", "a"."lng", "a"."radius" 
     FROM "question" "a" 
     WHERE "a"."id"=questionId 
     LIMIT 1 
    ); 


    RETURN QUERY SELECT "a"."id" 
    FROM "user" "a" INNER JOIN "notifications" "b" ON ("a"."id"="b"."user_id") 
    WHERE ("b"."category_id"=question.category_id OR "b"."urgent") AND 
     isGeoMatch("a"."lat", "a"."lng", "a"."radius", question.lat, question.lng, question.radius); 
    END 
    $$LANGUAGE plpgsql; 

CREATE TYPE map.get_near_link AS 
    (link_id integer, 
    distance integer, 
    direction integer, 
    geom public.geometry(4)); 

私は

sRow map.get_near_link; 

SELECT i.Link_ID, i.Distance, i.Direction, i.geom into sRow 
FROM 
    index_query i; 
+0

ありがとう、これは仕事をしました;)アドバイスをもう一度いただきありがとうございます。 – Lazyexpert

3

私はすべての複雑さをオフに取り除くと、それ普通のSQL作る得るでしょう:

create or replace function findrecipientsbyquestion (
    _questionid bigint 
) returns setof bigint as $$ 

    select a.id 
    from 
     user a 
     inner join 
     notifications b on a.id = b.user_id 
     inner join (
      select categoty_id, lat, lng, radius 
      from question 
      where id = _questionid 
      limit 1 
     ) q on q.category_id = b.category_id or b.urgent 
    where isgeomatch(a.lat, a.lng, a.radius, q.lat, q.lng, q.radius); 

$$ language sql; 
+0

提案ありがとう、これは間違いなく私のsollutionよりもきれいに見える – Lazyexpert

関連する問題