我对 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
);
SELECT
语句(包括微妙的事情)与
SELECT * FROM foo
有何不同?这个特定的声明有什么用?
getfoo(foo.fooid)
如何知道
foo.fooid
的值?当我们传入像
table.column
这样的参数时,函数是否总是迭代所有值?
EXPLAIN
查看 PostgreSQL 如何处理查询。
包括微妙的事情除了演示语法和功能之外,查询没有任何用处。它的查询仅消耗
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
项目。