Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

पुनरावर्ती SQL ORA-01790 दे रहा है

मेरी राय में, दिनांक या टाइमस्टैम्प कॉलम वाले प्रश्नों के लिए "रिकर्सिव सबक्वेरी फैक्टरिंग" 11g R2 में टूटा हुआ है।

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

पीछे की ओर गिनती? क्यों?

अपडेट 14-जनवरी-2014: वैकल्पिक हल के रूप में, अंतिम तिथि से शुरू होने वाले सीटीई का उपयोग करें और पुनरावर्ती सीटीई को पीछे की ओर बनाएं, जैसे:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLException प्राप्त करें java.sql.SQLException:ResultSet.next को कॉल नहीं किया गया था

  2. पीडीओ को पूरी तरह से समझना ATTR_PERSISTENT

  3. पीएल/एसक्यूएल में बूलियन का प्रयोग

  4. TO_CHAR(संख्या) फ़ंक्शन ORA-01722 लौटाता है:अमान्य संख्या

  5. Oracle SQL PLS-00049:खराब बाइंड वैरिएबल