首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PostgreSQL中横向连接和子查询之间有什么区别?

在PostgreSQL中横向连接和子查询之间有什么区别?
EN

Stack Overflow用户
提问于 2015-02-16 21:29:08
回答 3查看 214.6K关注 0票数 254

自从PostgreSQL有了完成LATERAL连接的能力之后,我就一直在阅读它,因为我目前为我的团队做了复杂的数据转储,有很多效率低下的子查询,使得整个查询需要4分钟或更长时间。

我知道LATERAL联接也许可以帮助我,但是即使在阅读了Heap的这一个这样的文章之后,我仍然不太明白。

LATERAL连接的用例是什么?LATERAL连接和子查询之间有什么区别?

EN

回答 3

Stack Overflow用户

发布于 2015-02-16 22:16:49

laterallateral连接之间的区别在于您是否可以查看左手表的行。例如:

代码语言:javascript
复制
select  *
from    table1 t1
cross join lateral
        (
        select  *
        from    t2
        where   t1.col1 = t2.col1 -- Only allowed because of lateral
        ) sub

这种“向外看”意味着必须对子查询进行多次计算。毕竟,t1.col1可以假定许多值。

相反,非lateral连接后的子查询可以计算一次:

代码语言:javascript
复制
select  *
from    table1 t1
cross join
        (
        select  *
        from    t2
        where   t2.col1 = 42 -- No reference to outer query
        ) sub

正如没有lateral所要求的那样,内部查询在任何方面都不依赖于外部查询。lateral查询是correlated查询的一个示例,因为它与查询本身之外的行有关联。

票数 113
EN

Stack Overflow用户

发布于 2015-02-16 21:51:40

首先,横向应用和交叉应用是一回事。因此,您也可以阅读有关交叉申请。因为它在Server中实现了很长时间,所以您会发现更多关于它的信息,然后是横向信息。

其次,根据我对的理解,没有什么是不能用子查询代替横向查询的。但是:

考虑下面的查询。

代码语言:javascript
复制
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 

在这种情况下,您可以使用横向。

代码语言:javascript
复制
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

在此查询中,由于限制子句,无法使用正常联接。横向或交叉应用可使用当没有简单的联接条件时

有更多的使用横向或交叉应用,但这是最常见的,我发现。

票数 16
EN

Stack Overflow用户

发布于 2018-10-05 18:12:32

没有人指出的一件事是,您可以使用LATERAL查询在每个选定的行上应用用户定义的函数。

例如:

代码语言:javascript
复制
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中做这类事情的唯一方法。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28550679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档