Oracle
 sql >> база данни >  >> RDS >> Oracle

Рекурсивният SQL дава ORA-01790

По мое мнение, „Рекурсивно факторизиране на подзаявки“ е нарушено в 11g R2 за заявки с колона за дата или време.

с 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') ))изберете * от тест;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 където X <=to_date('2010-01-10','YYYY-MM-DD') ))изберете * от тест;X-------------------2010 -01-01 00:00:001 избран ред 

Прехвърлянето на дата в дата помага, но къде са другите резултати?

Става още по-добре...

Опитайте с друга начална дата:

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 където X <=to_date('2011-01-11','YYYY-MM-DD') ))изберете * от тест където rownum <10; -- важно!X-------------------2007-01-01 00:00:002006-12-31 00:00:002006-12-30 00:00 :002006-12-29 00:00:002006-12-28 00:00:002006-12-27 00:00:002006-12-26 00:00:002006-12-25 00:00:002006-12- 24 00:00:009 избрани реда 

Броене назад? Защо?

Актуализация от 14 януари 2014 г.: Като заобиколно решение използвайте 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 КАТО ДАТА) от тест, където X> to_date('2011-01-01','YYYY-MM-DD') ))изберете * от тест  

Резултати:

<предварителен код>| X ||--------------------------------|| 20 януари 2011 г. 00:00:00+0000 || 19 януари 2011 г. 00:00:00+0000 || 18 януари 2011 г. 00:00:00+0000 || 17 януари 2011 г. 00:00:00+0000 || 16 януари 2011 г. 00:00:00+0000 || 15 януари 2011 г. 00:00:00+0000 || 14 януари 2011 г. 00:00:00+0000 || 13 януари 2011 г. 00:00:00+0000 || 12 януари 2011 г. 00:00:00+0000 || 11 януари 2011 г. 00:00:00+0000 || 10 януари 2011 г. 00:00:00+0000 || 09 януари 2011 г. 00:00:00+0000 || 08 януари 2011 г. 00:00:00+0000 || 07 януари 2011 г. 00:00:00+0000 || 06 януари 2011 г. 00:00:00+0000 || 05 януари 2011 г. 00:00:00+0000 || 04 януари 2011 г. 00:00:00+0000 || 03 януари 2011 г. 00:00:00+0000 || 02 януари 2011 г. 00:00:00+0000 || 01 януари 2011 г. 00:00:00+0000 |

Тестът е проведен с:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64-битово производство 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо агрегатните функции не са разрешени в клаузата where

  2. Заявка за каскадно изтриване

  3. Как да предавам динамично стойности към IN оператор?

  4. Добре ли е да използвате oracle 11g клиент с 10g сървър?

  5. EntityFramework Code First Oracle