zoukankan      html  css  js  c++  java
  • PostgreSQL的Lateral Joins

    lateral join就是在sql中进行一个foreach循环。有两种不同的方式写lateral join。

    如下,是一种简单的形式:

    SELECT <columns>
    FROM <table reference>,
         LATERAL <inner subquery>;
    

    这里的表引用可以是表、也可以是子查询。

    该示例中,会迭代<table reference>中的每一行对<inner subquery>的行进行评估。就像一个foreach循环。inner subquery返回的行会被加到lateral join的结果集中。

    使用lateral join的主要原因是inner subquery可以引用table reference中的行的列,并根据table reference中的列来决定inner subquery的返回值。为了帮助描述,以下是python代码模拟的lateral join:

    result = []
    for row1 in table_reference():
        for row2 in inner_subquery(row1):
            result += (row1, row2)
    

    应该可以看到,在内部for循环中迭代的行是在外部for循环中迭代的当前行的函数。

     

    假设表people有列(id 、age),表pets有列(id、owner_id、age)。

    有一个查询,想获取每个对于年龄超过30的人,他的最老的宠物的id。任何时候,当你听到“每个”的时候,你应该就会想到lateral join了。以下是我们给出的查询语句:

    SELECT people_sub.id, pets_sub.id
    FROM (SELECT id FROM people WHERE age > 30) people_sub,
         LATERAL (SELECT pets.id
                  FROM pets
                  WHERE pets.owner_id = people_sub.id
                  ORDER BY pets.age DESC
                  LIMIT 1) pets_sub;
    

    对于每个年龄超过30的人,这个查询都会评估内查询并将内查询的结果添加到整个查询。
    不管你相信与否,其他写法想实现上面的查询可能会很不容易,且不高效。

    另一中写lateral join的写法:

    SELECT <columns>
    FROM <table reference>
         JOIN LATERAL <outer subquery>
    ON TRUE;
    

    这样写的优点是你可以使用任何join修饰符(比如left join lateral)。在上面的例子中,如果还想获得没有养宠物的人,我们就需要使用 lateral left join 。通常,第一种方式就可以了。

  • 相关阅读:
    python读取数据写入excel
    English Study!
    ODOO里视图开发案例---定义一个像tree、form一样的视图
    更改gradle中央仓库,加快访问速度
    hadoop解决集群启动时某个slave的datanode挂掉问题
    ssh免密登录
    大数据集群脚本xcall和xsync
    虚拟机启动后黑屏并无法关闭
    快照与克隆的区别(来自转载)
    VMware12 打不开Centos6.8系统
  • 原文地址:https://www.cnblogs.com/abclife/p/13348087.html
Copyright © 2011-2022 走看看