自从PostgreSQL有了完成LATERAL连接的能力之后,我就一直在阅读它,因为我目前为我的团队做了复杂的数据转储,有很多效率低下的子查询,使得整个查询需要4分钟或更长时间。
我知道LATERAL联接也许可以帮助我,但是即使在阅读了Heap的这一个这样的文章之后,我仍然不太明白。
LATERAL连接的用例是什么?LATERAL连接和子查询之间有什么区别?
发布于 2015-02-16 22:16:49
非lateral和lateral连接之间的区别在于您是否可以查看左手表的行。例如:
select *
from table1 t1
cross join lateral
(
select *
from t2
where t1.col1 = t2.col1 -- Only allowed because of lateral
) sub这种“向外看”意味着必须对子查询进行多次计算。毕竟,t1.col1可以假定许多值。
相反,非lateral连接后的子查询可以计算一次:
select *
from table1 t1
cross join
(
select *
from t2
where t2.col1 = 42 -- No reference to outer query
) sub正如没有lateral所要求的那样,内部查询在任何方面都不依赖于外部查询。lateral查询是correlated查询的一个示例,因为它与查询本身之外的行有关联。
发布于 2015-02-16 21:51:40
首先,横向应用和交叉应用是一回事。因此,您也可以阅读有关交叉申请。因为它在Server中实现了很长时间,所以您会发现更多关于它的信息,然后是横向信息。
其次,根据我对的理解,没有什么是不能用子查询代替横向查询的。但是:
考虑下面的查询。
Select A.*
, (Select B.Column1 from B where B.Fk1 = A.PK and Limit 1)
, (Select B.Column2 from B where B.Fk1 = A.PK and Limit 1)
FROM A 在这种情况下,您可以使用横向。
Select A.*
, x.Column1
, x.Column2
FROM A LEFT JOIN LATERAL (
Select B.Column1,B.Column2,B.Fk1 from B Limit 1
) x ON X.Fk1 = A.PK在此查询中,由于限制子句,无法使用正常联接。横向或交叉应用可使用当没有简单的联接条件时。
有更多的使用横向或交叉应用,但这是最常见的,我发现。
发布于 2018-10-05 18:12:32
没有人指出的一件事是,您可以使用LATERAL查询在每个选定的行上应用用户定义的函数。
例如:
CREATE OR REPLACE FUNCTION delete_company(companyId varchar(255))
RETURNS void AS $$
BEGIN
DELETE FROM company_settings WHERE "company_id"=company_id;
DELETE FROM users WHERE "company_id"=companyId;
DELETE FROM companies WHERE id=companyId;
END;
$$ LANGUAGE plpgsql;
SELECT * FROM (
SELECT id, name, created_at FROM companies WHERE created_at < '2018-01-01'
) c, LATERAL delete_company(c.id);这是我知道如何在PostgreSQL中做这类事情的唯一方法。
https://stackoverflow.com/questions/28550679
复制相似问题