表函数的范围和功能

问题描述 投票:0回答:2

我对 PostgreSQL 手册中的表函数示例有一些疑问:

CREATE TABLE foo (fooid int, foosubid int, fooname text); CREATE FUNCTION getfoo(int) RETURNS SETOF foo AS $$ SELECT * FROM foo WHERE fooid = $1; $$ LANGUAGE SQL; SELECT * FROM foo WHERE foosubid IN ( SELECT foosubid FROM getfoo(foo.fooid) z WHERE z.fooid = foo.fooid );

  1. 这个特定的嵌套

    SELECT

     语句(包括微妙的事情)与 
    SELECT * FROM foo
     有何不同?这个特定的声明有什么用?

  2. getfoo(foo.fooid)

    如何知道
    foo.fooid
    的值?当我们传入像 
    table.column
     这样的参数时,函数是否总是迭代所有值?

sql postgresql syntax set-returning-functions
2个回答
0
投票
  1. 该查询没有执行任何有用的操作并返回所有表行。这只是一个例子。

  2. 将为表的每一行调用该函数。您可以使用

    EXPLAIN

     查看 PostgreSQL 如何处理查询。


0
投票
1.

包括微妙的事情

除了演示语法和功能之外,查询没有任何用处。它的查询仅消耗

SELECT * FROM foo

 - 只不过它消除了 
fooid
foosubid
 中具有空值的行。所以实际的简单等价物是:

SELECT * FROM foo WHERE fooid IS NOT NULL AND foosubid IS NOT NULL;

小提琴

如果表有

NOT NULL

 约束(包括 PK 的隐式约束),则除了性能之外不会有任何有效差异。

2.

IN

表达式中子查询的范围扩展到主查询,其中
foo
FROM
子句中列出。实际上是一个隐式 
LATERAL
 子查询,其中子查询针对主查询中的每一行执行一次。 
手册

FROM

中出现的子查询前面可以带有关键字
LATERAL
。这允许他们引用前面提供的列
FROM
 项目。 (没有 
LATERAL
,每个子查询都会被评估
独立,因此不能交叉引用任何其他
FROM
项目。)

FROM

中出现的表函数也可以在键之前
单词 
LATERAL
,但对于函数来说,关键字是可选的;这
函数的参数可以包含对以下提供的列的引用
无论如何,前面的 
FROM
 项目。

参见:

  • PostgreSQL 中的 LATERAL JOIN 和子查询有什么区别?
© www.soinside.com 2019 - 2024. All rights reserved.