繁体   English   中英

单个选择列表中的SQL多个UNNEST

[英]SQL multiple UNNEST in single select list

我正在实现一个Query系统。 我实现了不需要的功能。 现在用户询问在单个select语句中使用多个unfst。 我使用PostgreSQL作为指南,因为大多数用户在我们的查询系统之前使用它。

PostgreSQL有这样奇怪的行为:

postgres=# select unnest(array[1,2]), unnest(array[1,2]);
 unnest | unnest
--------+--------
      1 |      1
      2 |      2
(2 rows)

postgres=# select unnest(array[1,2]), unnest(array[1,2,3]);
 unnest | unnest
--------+--------
      1 |      1
      2 |      2
      1 |      3
      2 |      1
      1 |      2
      2 |      3
(6 rows)

我的实现总是生成笛卡尔积。 我想知道,这背后的正确逻辑是什么? PostgreSQL正在做正确的事还是只是一个bug? 我没有在ANSI文档或PostgreSQL文档中找到明确的描述。

这不是关于不必要的,而是关于PostgreSQL在SELECT列表中对多个集合返回函数的非常奇怪的处理。 SELECT中的Set-returns函数不是ANSI SQL标准的一部分。

你会发现LATERAL查询的行为更加理智,这应该比在FROM尽可能使用set-returns函数更受欢迎:

select a, b FROM unnest(array[1,2]) a, LATERAL unnest(array[1,2,3]) b;

例如

regress=> select a, b FROM unnest(array[1,2]) a, LATERAL unnest(array[1,2,3]) b;
 a | b 
---+---
 1 | 1
 1 | 2
 1 | 3
 2 | 1
 2 | 2
 2 | 3
(6 rows)

我仍然在SELECT使用多个set-returns函数的唯一时间是我想要从返回相同行数的函数中配对值。 需要将消失在9.4,具有多参数unnest和用于支持WITH ORDINALITY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM