首页 > 数据库 > mysql教程 > 为什么 SELECT 子句中的多个返回集合的函数并不总是在 PostgreSQL 中产生交叉连接?

为什么 SELECT 子句中的多个返回集合的函数并不总是在 PostgreSQL 中产生交叉连接?

Barbara Streisand
发布: 2025-01-17 23:57:09
原创
124 人浏览过

Why Do Multiple Set-Returning Functions in a SELECT Clause Not Always Produce a Cross Join in PostgreSQL?

PostgreSQL 在 SELECT 语句中使用多个集合返回函数的意外行为

问题:

SELECT 语句的子句中使用多个返回集合的函数可能会产生意外的结果,特别是当集合的长度不相等时。 generate_series(1, 3)generate_series(5, 7) 产生交叉连接,而 generate_series(1, 2)generate_series(1, 4) 则不会。这种不一致令人费解。

说明:

关键在于PostgreSQL版本差异。 PostgreSQL 10 及更高版本对此的处理方式与早期版本(9.6 及之前版本)不同。

PostgreSQL 10 及更高版本:

PostgreSQL 10 及后续版本将 SELECT 列表中的多个返回集合的函数处理为类似于 LATERAL ROWS FROM(...) 子句。 这些函数同步执行,并且较短的集合用 NULL 值填充以匹配最长集合的长度。这确保了完整的交叉连接。 例如:

<code>row2 | row3 | row4
-----+------+-----
1 | 11 | 21
2 | 12 | 22
NULL | 13 | 23
NULL | NULL | 24</code>
登录后复制

PostgreSQL 9.6 及更早版本:

在旧版本(9.6 及之前)中,结果集的行计数等于单个函数行计数的最小公倍数 (LCM)。 仅当集合大小不共享公约数时才会发生交叉连接。 使用相同的示例,输出将是:

<code>row2 | row3 | row4
-----+------+-----
1 | 11 | 21
2 | 12 | 22
1 | 13 | 23
2 | 11 | 24
1 | 12 | 21
2 | 13 | 22
1 | 11 | 23
2 | 12 | 24
1 | 13 | 21
2 | 11 | 22
1 | 12 | 23
2 | 13 | 24</code>
登录后复制

最佳实践:

为了避免意外结果,最好使用 LATERAL 连接或子查询,而不是直接将多个返回集合的函数放在 SELECT 列表中。这提供了更清晰的控制和可预测的行为。

更多详细信息和相关信息,请查阅 PostgreSQL 官方文档:

以上是为什么 SELECT 子句中的多个返回集合的函数并不总是在 PostgreSQL 中产生交叉连接?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板