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)列中得到了重复的结果,非常感谢!分组加入这是我需要的