首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SELECT子句中多个set-returns函数的预期行为是什么?

SELECT子句中多个set-returns函数的预期行为是什么?
EN

Stack Overflow用户
提问于 2019-06-13 04:46:47
回答 2查看 0关注 0票数 0

我试图通过两个set-returns函数得到一个“交叉连接”,但在某些情况下我没有得到“交叉连接”,请参阅示例

行为1:当设置的长度相同时,它会逐个匹配每个集合中的项目

代码语言:javascript
复制
postgres =#SELECT generate_series(1,3),generate_series(5,7)按1,2排序;
 generate_series | generate_series
-----------------+-----------------
               1 |               5
               2 |               6
               3 |               7
(3排)

行为2:当设置的长度不同时,它会“交叉连接”这些集合

代码语言:javascript
复制
postgres =#SELECT generate_series(1,2),generate_series(5,7)按1,2排序;
 generate_series | generate_series
-----------------+-----------------
               1 |               5
               1 |               6
               1 |               7
               2 |               5
               2 |               6
               2 |               7
(6排)

我想我在这里不了解一些事情,有人可以解释一下这种行为吗?

另一个例子,甚至更奇怪:

代码语言:javascript
复制
postgres =#SELECT generate_series(1,2)x,generate_series(1,4)y by x,y;
 x | ÿ
---+---
 1 | 1
 1 | 3
 2 | 2
 2 | 4
(4排)

我正在寻找标题中问题的答案,理想情况是链接到文档。

EN

回答 2

Stack Overflow用户

发布于 2019-06-13 13:46:31

Postgres 10或更新

为较小的集添加空值。演示generate_series()

代码语言:javascript
复制
SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
代码语言:javascript
复制
row2 | row3 | ROW4
-----+------+-----
   1 |   11 |   21
   2 |   12 |   22

dbfiddle 在这里

Postgres 10的手册

如果查询的选择列表中有多个设置返回函数,则行为类似于将函数放入单个LATERAL ROWS FROM( ... ) FROM项目中所获得的行为。对于基础查询中的每一行,都有一个输出行,使用每个函数的第一个结果,然后是使用第二个结果的输出行,依此类推。如果某些set-returns函数产生的输出少于其他函数,则将null值替换为缺失数据,以便为一个底层行发出的总行数与生成最多输出的set-returns函数相同。因此,set-returns函数以“锁步”方式运行,直到它们全部耗尽,然后继续执行下一个底层行。

这结束了传统上奇怪的行为。

Postgres 9.6或更高版本

结果行的数量(有点令人惊讶!)是同一列表中所有集合的最低公倍数SELECT。(只有CROSS JOIN如果所有设置大小都没有公约数!)演示:

代码语言:javascript
复制
SELECT generate_series( 1,  2) AS row2
     , generate_series(11, 13) AS row3
     , generate_series(21, 24) AS row4;
代码语言:javascript
复制
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

dbfiddle 在这里

记录在手册的Postgres 9.6SQL函数返回集合与建议,一起避免:

注意:在选择列表而不是FROM子句中使用set-returns函数的关键问题是在同一个选择列表中放置多个set-returns函数的行为不是很明智。(如果这样做,实际得到的是一些输出行,它们等于每个set-returns函数产生的行数的最小公倍数。LATERAL当调用多个set-returns函数时,语法产生的结果不那么令人惊讶,并且通常应该使用。

大胆强调我的。

单个设置返回功能正常(但在FROM列表中仍然更清晰),但SELECT现在不鼓励使用同一列表中的多个。在我们LATERAL加入之前,这是一个有用的功能。现在它只是历史的镇流器。

有关:

票数 0
EN

Stack Overflow用户

发布于 2019-06-13 14:29:32

文档中有关于该问题的唯一注释。我不确定这是否解释了所描述的行为。也许更重要的是不推荐使用这样的函数:

目前,还可以在查询的选择列表中调用返回集的函数。对于查询自身生成的每一行,将调用函数返回集,并为函数结果集的每个元素生成输出行。但请注意,此功能已弃用,可能会在将来的版本中删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100009096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档