簡體   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