0

たとえば、テーブルusers(ID、名前、メール)があります。テーブルがありますphotos(id, value) userphotosuser_id, photo_id の関係からなるテーブルがあります。

このような方法ですべてのユーザーの写真を取得する関数が必要です:

  1. id1 名前1 電子メール1 写真1
  2. id2 名前2 メール2 写真2

ユーザーの写真の枚数は不明です。

そのような結果を作成するためにplpgsql関数を作成する方法は?

CREATE OR REPLACE FUNCTION test_function()
  RETURNS TABLE(id int, name character varying, email character varying,  photos int[]) AS $
DECLARE
    u RECORD;
BEGIN
    FOR u IN SELECT * FROM users LOOP
        return NEXT u; -- will return user without photos
    -- but how to populate u with photos as array
    -- got from query:
    --          SELECT photo_id FROM userphotos WHERE user_id = u.id
    END LOOP;
END;
$ LANGUAGE plpgsql

PostgreSQL バージョン 9.0。

4

1 に答える 1

2

次のようになります。

CREATE OR REPLACE FUNCTION test_function()
  RETURNS TABLE(id int, name varchar, email varchar, photos int[]) AS
$func$
BEGIN

RETURN QUERY
SELECT u.id, u.name, u.email, array_agg(up.photo_id)  -- AS photo_ids
FROM   users u
LEFT   JOIN userphotos up ON  up.user_id = u.id
GROUP  BY u.int, u.name, u.email;

END
$func$ LANGUAGE plpgsql
  • 適切な引用を使用してください。ドル引用についてのマニュアルを読んでください。
  • RETURN QUERYplpgsql 関数から行を返す最も簡単な方法として使用します。必要ありませんLOOP
  • にはLEFT JOIN、写真をまったく持っていないユーザーが含まれます。
  • 名前の競合に注意してください。句のすべてのOUTパラメータは、本文のどこにでも表示されます。RETURNS TABLE

コメント後の追記

複数の1:n テーブルを結合する場合、それらを一度に結合することはできません。これは何が起こるかです:
https://stackoverflow.com/a/12464135/939860

この問題の解決策と密接に関連する別の回答:
https://stackoverflow.com/a/14110017/939860

于 2013-01-03T01:24:15.903 に答える