我想學習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的組合將會或不會起作用?
雖然最終的查詢看起來很笨拙,它應該是好的,恕我直言。它可能是解析器中的優先/關聯性錯誤。有一些語義限制(無嵌套遞歸CTE,IIRC);也許解析器太挑剔,或者太觸發了。就我個人而言,我使用了很多嵌套的CTE(深達4級),但除了遞歸CTE之外,我很少使用UNION。 – wildplasser 2012-07-31 16:24:35
@AdamMackler你應該把它作爲你自己的問題的答案 – araqnid 2012-07-31 19:55:27
Tom Lane承認你發現了一個錯誤,就像你提出了一個非常好的問題,正式的批准。請將您從列表中獲得的內容作爲答案發布,並確保添加鏈接到該主題。 – 2012-08-01 00:01:26