由于Postgres能够进行LATERAL连接,我一直在阅读它,因为我目前为我的团队执行复杂的数据转储,其中包含大量低效的子查询,这使得整个查询需要四分钟或更长时间.
我知道LATERAL联接可能能够帮助我,但即使在阅读了像Heap Analytics 这样的文章之后,我仍然没有完全遵循.
LATERAL加入的用例是什么?LATERAL连接和子查询之间有什么区别?
我试图将这种格式的嵌套数据从PostgreSQL返回到PHP关联数组.
[
'person_id': 1,
'name': 'My Name',
'roles': [
[ 'role_id': 1, 'role_name': 'Name' ],
[ 'role_id': 2, 'role_name': 'Another role name' ]
]
]
Run Code Online (Sandbox Code Playgroud)
似乎可以使用复合类型.这个答案描述了如何从函数返回复合类型,但它不处理复合类型的数组.我在使用数组时遇到了一些麻烦.
这是我的表和类型:
CREATE TEMP TABLE people (person_id integer, name text);
INSERT INTO "people" ("person_id", "name") VALUES
(1, 'name!');
CREATE TEMP TABLE roles (role_id integer, person_id integer, role_name text);
INSERT INTO "roles" ("role_id", "person_id", "role_name") VALUES
(1, 1, 'role name!'),
(2, 1, 'another role');
CREATE TYPE role AS (
"role_name" text
); …Run Code Online (Sandbox Code Playgroud) 这是plpgsql 函数的一个变体,它返回多个列,并被多次调用。然而,我希望找到针对我的特殊情况的解决方案。
我有一个函数,它处理具有给定参数的行数组,并返回一组行+一个新列。
CREATE OR REPLACE foo(data data[], parameter int) RETURNS SETOF enhanceddata AS
...
Run Code Online (Sandbox Code Playgroud)
该函数适用于只有一组数据的测试用例
SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1)
Run Code Online (Sandbox Code Playgroud)
但我想让它处理多组数据,而不将 a 传递dataid给函数。我尝试了多种变体:
SELECT dataid, (foo(ARRAY_AGG(data)),1).*
FROM dataset
WHERE dataid = something -- only testing on 1
GROUP BY dataid
Run Code Online (Sandbox Code Playgroud)
但该函数会为每一列调用一次。