27

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 のどの組み合わせが機能するか、または機能しないかを予測できる一般的なルールはありますか?

4

1 に答える 1

26

謎は解かれました:私が観察していた振る舞いは既知のバグです。同じ元の投稿をPostgreSQL固有のリストに送信し、次の回答を得ました。

これはバグです:-(。解析コードは、WITHは集合演算ツリー内のトップレベルまたはリーフレベルのSELECTにのみアタッチできると考えているようですが、文法はそのようなことを述べていないSQL標準に従います。 WITHが受け入れられ、構文的に配置されるべき中間レベルのUNIONにアタッチされ、解析分析中に完全に無視されます。これを修正する方法について説明します。

      regards, tom lane

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

于 2012-08-01T07:33:36.620 に答える