由于Postgres能够进行LATERAL连接,我一直在阅读它,因为我目前为我的团队执行复杂的数据转储,其中包含大量低效的子查询,这使得整个查询需要四分钟或更长时间.
我知道LATERAL联接可能能够帮助我,但即使在阅读了像Heap Analytics 这样的文章之后,我仍然没有完全遵循.
LATERAL加入的用例是什么?LATERAL连接和子查询之间有什么区别?
当函数返回a TABLE或a时SETOF composite-type,如此示例函数:
CREATE FUNCTION func(n int) returns table(i int, j bigint) as $$
BEGIN
RETURN QUERY select 1,n::bigint
union all select 2,n*n::bigint
union all select 3,n*n*n::bigint;
END
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
结果可以通过各种方法访问:
1)select * from func(3)将产生这些输出列:
i | j ---+--- 1 | 3 2 | 9 3 | 27
2)select func(3)将只生成一个ROW类型的输出列.
func ------- (1,3) (2,9) (3,27)
3)select (func(3)).*会产生#1:
i | j ---+--- 1 | 3 2 | 9 3 | …
我subquery must return only one column尝试运行以下查询时收到错误:
SELECT mat.mat as mat1, sum(stx.total ) as sumtotal1,
(
SELECT mat.mat as mat, sum(stx.total) as sumtotal
FROM stx
LEFT JOIN mat ON stx.matid = mat.matid
LEFT JOIN sale ON stx.saleid = sale.id
WHERE stx.date BETWEEN '2013-05-01' AND '2013-08-31'
AND sale.userid LIKE 'A%'
GROUP BY mat.mat
) AS MyField
FROM stx
LEFT JOIN mat ON stx.matid = mat.matid
LEFT JOIN sale ON stx.saleid = sale.id
WHERE stx.date BETWEEN '2013-05-01' AND '2013-08-31'
AND sale.userid …Run Code Online (Sandbox Code Playgroud)