sql >> データベース >  >> RDS >> Oracle

ORA-01790を提供する再帰SQL

    私の意見では、「再帰的サブクエリファクタリング」は、日付またはタイムスタンプ列を持つクエリの11gR2で壊れています。

    with test(X) as
    (
      select to_date('2010-01-01','YYYY-MM-DD') from dual
      union all (
        select (X + 1) from test where X <= to_date('2010-01-10','YYYY-MM-DD') 
      )
    )
    select * from test;
    
    ORA-01790
    

    キャストを使用してデータ型を変換します:

    with test(X) as
    (
      select cast(to_date('2010-01-01','YYYY-MM-DD') as date) from dual
      union all (
        select (X + 1) from test where X <= to_date('2010-01-10','YYYY-MM-DD') 
      )
    )
    select * from test;
    
    X
    -------------------
    2010-01-01 00:00:00
    
    1 row selected
    

    日付を日付にキャストすることは役に立ちますが、他の結果はどこにありますか?

    さらに良くなります...

    別の開始日で試してください:

    with test(X) as
    (
      select cast(to_date('2007-01-01','YYYY-MM-DD') as DATE) from dual
      union all (
        select (X + 1) from test where X <= to_date('2011-01-11','YYYY-MM-DD') 
      )
    )
    select * from test 
    where rownum < 10; -- important!
    
    X
    -------------------
    2007-01-01 00:00:00
    2006-12-31 00:00:00
    2006-12-30 00:00:00
    2006-12-29 00:00:00
    2006-12-28 00:00:00
    2006-12-27 00:00:00
    2006-12-26 00:00:00
    2006-12-25 00:00:00
    2006-12-24 00:00:00
    
    9 rows selected
    

    逆算しますか?なんで?

    2014年1月14日更新: 回避策として、次のように、終了日から開始して再帰CTEを逆方向に構築するCTEを使用します。

    with test(X) as
    (
      select cast(to_date('2011-01-20','YYYY-MM-DD') as DATE) as x from dual
      union all (
        select cast(X - 1 AS DATE) from test 
        where X > to_date('2011-01-01','YYYY-MM-DD') 
      )
    )
    select * from test 
    

    結果:

    |                              X |
    |--------------------------------|
    | January, 20 2011 00:00:00+0000 |
    | January, 19 2011 00:00:00+0000 |
    | January, 18 2011 00:00:00+0000 |
    | January, 17 2011 00:00:00+0000 |
    | January, 16 2011 00:00:00+0000 |
    | January, 15 2011 00:00:00+0000 |
    | January, 14 2011 00:00:00+0000 |
    | January, 13 2011 00:00:00+0000 |
    | January, 12 2011 00:00:00+0000 |
    | January, 11 2011 00:00:00+0000 |
    | January, 10 2011 00:00:00+0000 |
    | January, 09 2011 00:00:00+0000 |
    | January, 08 2011 00:00:00+0000 |
    | January, 07 2011 00:00:00+0000 |
    | January, 06 2011 00:00:00+0000 |
    | January, 05 2011 00:00:00+0000 |
    | January, 04 2011 00:00:00+0000 |
    | January, 03 2011 00:00:00+0000 |
    | January, 02 2011 00:00:00+0000 |
    | January, 01 2011 00:00:00+0000 |
    

    実施したテスト:

    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    


    1. SSRSのデータソース間で参加できますか?

    2. インデックスクエリによる低速検索LIKE%MYSQL

    3. MySQLの日付またはPHPの時間?

    4. 同じテーブル内の他の2つの列を連結して列を更新する方法