2012-07-31 50 views
16

我想學習SQL,使用PostgreSQL 9.1.3。我想了解一些令我感到不一致的行爲。即:PostgreSQL嵌套CTE和UNION

這工作:

WITH innermost AS (SELECT 2) 
SELECT * FROM innermost 
UNION SELECT 3; 

我得到這個:

?column? 
---------- 
     2 
     3 

這工作:

WITH outmost AS (
     (WITH innermost AS (SELECT 2) 
     SELECT * FROM innermost) 
)         
SELECT * FROM outmost; 

結果:

?column? 
---------- 
     2 

這也適用:

WITH outmost AS (
    SELECT 1 
    UNION (WITH innermost AS (SELECT 2) 
     SELECT * FROM innermost) 
) 
SELECT * FROM outmost; 

我得到這個:

?column? 
---------- 
     1 
     2 

但這工作:

WITH outmost AS (
    SELECT 1 
    UNION (WITH innermost as (SELECT 2) 
     SELECT * FROM innermost 
     UNION SELECT 3) 
) 
SELECT * FROM outmost; 

結果:

ERROR: relation "innermost" does not exist 
LINE 4:   SELECT * FROM innermost 

以我的想法,最後一個應該成功,否則其中一個應該失敗。我沒有看到這種模式。是否有一些通用規則可以使我預測嵌套CTE和UNION的組合將會或不會起作用?

+0

雖然最終的查詢看起來很笨拙,它應該是好的,恕我直言。它可能是解析器中的優先/關聯性錯誤。有一些語義限制(無嵌套遞歸CTE,IIRC);也許解析器太挑剔,或者太觸發了。就我個人而言,我使用了很多嵌套的CTE(深達4級),但除了遞歸CTE之外,我很少使用UNION。 – wildplasser 2012-07-31 16:24:35

+2

@AdamMackler你應該把它作爲你自己的問題的答案 – araqnid 2012-07-31 19:55:27

+3

Tom Lane承認你發現了一個錯誤,就像你提出了一個非常好的問題,正式的批准。請將您從列表中獲得的內容作爲答案發布,並確保添加鏈接到該主題。 – 2012-08-01 00:01:26

回答

17

神祕感解決了:我觀察到的行爲是一個已知的錯誤。我發出同樣的原帖到一個特定的PostgreSQL的名單,並得到了這樣的回答:。

這是:-(一個錯誤的解析分析代碼似乎認爲,隨着 只能連接到頂層或葉級一 設置操作樹中選擇;但語法遵循SQL標準, 說沒有這樣的事在與被接受的,並連接到 中級UNION這就是語法上它應該去, 和。那麼它在解析分析時完全被忽略了,將會看到大約 修復它

 regards, tom lane 

http://archives.postgresql.org/pgsql-novice/2012-07/msg00113.php

+3

似乎已經在9.2 beta3中修復了。我引用了這個新聞稿:'*解決與set操作(UNION/INTERSECT/EXCEPT)問題'。 – 2012-08-07 08:12:59

+2

我剛剛安裝了9.2beta3,並且是的,原始文章中的非工作命令現在可以按預期工作。謝謝你的提醒。 – 2012-08-11 23:38:03

+0

酷!謝謝你跟蹤這個!你的問題值得更多upvotes。順便說一下,鼓勵在這種情況下接受你自己的(正確的)答案。 – 2012-08-12 00:53:47