【问题标题】:It's a function or table in this later join case?在这个稍后的连接案例中,它是一个函数还是一个表?
【发布时间】:2020-11-22 04:24:42
【问题描述】:

LEFT JOIN 到 LATERAL 子查询通常特别方便,这样即使 LATERAL 子查询没有为源行生成任何行,源行也会出现在结果中。例如,如果 get_product_names() 返回制造商生产的产品名称,但我们表中的某些制造商当前没有生产产品,我们可以找出哪些是这样的:

SELECT m.name
FROM manufacturers m LEFT JOIN LATERAL get_product_names(m.id) pname ON true
WHERE pname IS NULL;

所有内容摘自 PostgreSQL 手册。 LINK 现在我终于可能明白 LATERAL 是什么意思了。在这种情况下,

总的来说,我不确定 get_product_names 是表还是函数。以下是我的理解。
A:get_product_names(m.id) 是一个函数,使用m.id 作为输入参数返回一个表。返回表别名为pname。总体而言,它是一个表 m 连接一个空(where 条件)表。

B:get_product_names 是一个表,表 m 在 m.id 上左连接表 get_product_namespnameget_product_names 的别名。总体而言,它是一个表 m 连接一个空(where 条件)表。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    get_product_names 是一个表函数(在 PostgreSQL 俚语中也称为 set 返回函数 或 SRF)。这样的函数不一定返回单个结果行,而是任意多行。

    由于此类函数的结果是一个表,因此您通常在 SQL 语句中使用它,您将使用表,即在 FROM 子句中。

    一个简单的例子是

    SELECT * FROM generate_series(1, 5);
    
     generate_series 
    -----------------
                   1
                   2
                   3
                   4
                   5
    (5 rows)
    

    您也可以通过这种方式使用普通函数,然后将它们视为只返回一行的表函数。

    【讨论】:

    • 所以总的来说我的猜测是正确的。这意味着对于manufacturers.id也在pname表中的所有制造商名称。
    • 不,查询的写法,只会返回制造商的名字。但是,如果一个制造商有多个产品名称,您将获得该名称的次数与产品数量一样多。如果将pname 中的列添加到SELECT 列表中,查询将更有意义。
    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2011-06-24
    相关资源
    最近更新 更多