PostgreSQL 9.1.3 を使用して SQL を学習しようとしています。矛盾していると思われるいくつかの動作を理解したいと思います。ウィット:
これは機能します:
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
私の考え方では、最後の 1 つが成功するか、他の 1 つが失敗するかのどちらかです。パターンが見えません。ネストされた CTE と UNION のどの組み合わせが機能するか、または機能しないかを予測できる一般的なルールはありますか?