2016-11-14 8 views
1

複数の行を返すWITHクエリでPERFORMを使用しようとしています。複数行の場合にWITH句を使用して実行する

CREATE OR REPLACE FUNCTION test_function() RETURNS void AS $$ 

BEGIN 

PERFORM (
WITH selection AS (
    SELECT id, 
    ROW_NUMBER() OVER w AS r, 
    first_value(id) OVER w AS first_value, 
    nth_value(id, 5) OVER w AS last_value 
    FROM mytable 
    WINDOW w AS (PARTITION BY v.ability_id ORDER BY unit_id ASC) 
) 
create_question(id, 1, 1, 1) 
FROM selection 
WHERE ability_id IN (
    SELECT ability_id 
    FROM selection 
    WHERE last_value > 0.5 
    ORDER BY first_value DESC 
) 
AND selection.r <= 5 
); 

END; 
$$ LANGUAGE plpgsql; 

と私はエラーを取得する:

ERROR: more than one row returned by a subquery used as an expression 

postgresのドキュメントは、それが出来ないと言う:

For WITH queries, use PERFORM and then place the query in parentheses. (In this case, the query can only return one row.)

離れ書き込みから、この問題を解決するために何ができますかWithクエリ(ここでの選択と呼ばれる)は2回ですか?

+0

あなたのCTEで 'ability_id'が選択されていません。 – wildplasser

+0

はい、達成しようとしていたものの味を与えるためにクエリを簡略化しました。実際にはそれがあります。 –

答えて

2

備考: の直前にSELECTというクエリがありません。

トリックは、単一の行を返すようにクエリを変更することです。

これは、集計関数を使用して行うことができます。書き込み:

SELECT 
    count(create_question(id, 1, 1, 1)) 
FROM selection 
... 

その後、クエリが1行だけ返し、PERFORM文でサブクエリとして使用することができます。

関連する問題