Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从子表创建值数组_Sql_Arrays_Postgresql_Join_Plpgsql - Fatal编程技术网

Sql 从子表创建值数组

Sql 从子表创建值数组,sql,arrays,postgresql,join,plpgsql,Sql,Arrays,Postgresql,Join,Plpgsql,例如,我有表用户(id、姓名、电子邮件)。有表照片(id,值) 有一个表userphotos,它由以下关系组成: 用户id,照片id 我需要一个函数来获取所有用户的照片,方法如下: id1名称1电子邮件1照片1 id2姓名2电子邮件2照片2 等等 用户的照片数量未知 如何创建plpgsql函数来创建这样的结果 CREATE OR REPLACE FUNCTION test_function() RETURNS TABLE(id int, name character varying, ema

例如,我有表
用户
(id、姓名、电子邮件)。有表
照片
(id,值)
有一个表
userphotos
,它由以下关系组成: 用户id,照片id

我需要一个函数来获取所有用户的照片,方法如下:

  • id1名称1电子邮件1照片1
  • 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
    

    Postgrever。9.0.

    可能看起来像这样:

    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
    
    • 使用适当的引用。请阅读有关的手册
    • 作为从plpgsql函数返回行的最简单方法。无需
      循环
    • 左连接
      包括完全没有照片的用户
    • 小心命名冲突。
      返回表
      子句中的所有
      OUT
      参数在正文中随处可见

    评论后的增编 如果要联接多个1:n表,则不能同时联接所有表。这就是发生的情况:

    另一个与此问题的解决方案密切相关的答案:

    在结果中定义“photos1”。您是在结果中为每个
    userphotos
    指定一行,还是为每个用户指定一个照片列表?由
    id
    value
    表示?。函数中的
    partners
    来自哪里?添加您的PostgreSQL版本。抱歉,“partners”来自另一个示例。我已经更正并添加了posgresql版本。它起作用了。但是,如果我必须做多个连接,我会遇到问题。例如,我还必须从表
    usergroups
    中获取每个用户的用户组。我又添加了一个左连接,在array\u agg(up.photo\u id)列中得到了重复的结果,非常感谢!分组加入这是我需要的