2017-06-02 2 views
0

Ich versuche, ein rekursives CTE in der from-Klausel zu verwenden. Dieser CTE arbeitet von selbst:CTE in der DB2-Unterabfrage

with i (i) as ( 
    values (1) 
    union all 
    select i + 1 from i 
    where i < 3 
) 
select * from i; 

      I 
------------- 
      1 
      2 
      3 

Aber wenn ich es in der from Klausel versuchen:

select * 
from (
    with i (i) as ( 
     values (1) 
     union all 
     select i + 1 from i 
     where i < 3 
    ) 
    select * from i 
) i; 
ERRO próximo da linha 1: 
SQL0104N An unexpected token "as" was found following "* 
from (
with i (i)". Expected tokens may include: "JOIN". 

Ein ähnliches Konstrukt funktioniert in Postgresql. Was vermisse ich?

+0

Warum brauchen Sie einen CTE in der 'FROM' Klausel? Sieht für mich wie ein X-Y-Problem aus. Wie Sie sehen, ist es in DB2 syntaktisch falsch (und semantisch unnötig). – mustaccio

+0

@mustaccio Es könnte auch eine korrelierte Unterabfrage in der Auswahlliste sein, aber ich dachte, es wäre sauberer in einem lateralen Join. Ich kann die korrelierte Unterabfrage jetzt nicht testen. Ist es legal? –

Antwort

1

Hallo "mit" Anweisung muss in DB2 Query ersten sein, versuchen Sie diesen

with i (i) as (
    values (1) 
    union all 
    select i + 1 from i 
    where i < 3 
) 
select * 
    from (

      select * from i 
     ) i;