Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

SQL đệ quy cho ORA-01790

Theo ý kiến ​​của tôi, "Tính toán truy vấn con đệ quy" bị hỏng trong 11g R2 đối với các truy vấn có cột ngày tháng hoặc dấu thời gian.

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

sử dụng diễn viên để chuyển đổi kiểu dữ liệu:

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

Chuyển một ngày thành một ngày là hữu ích, nhưng các kết quả khác ở đâu?

Nó thậm chí còn tốt hơn ...

Hãy thử nó với một ngày bắt đầu khác:

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

Tính ngược? Tại sao?

Cập nhật ngày 14 tháng 1 năm 2014: Để giải quyết vấn đề này, hãy sử dụng CTE bắt đầu bằng ngày kết thúc và xây dựng CTE đệ quy ngược lại, như sau:

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 

Kết quả:

|                              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 |

Thử nghiệm được tiến hành với:

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. Trường Oracle to SQL2005 DATETIME tràn trong SSIS

  2. cách điền cơ sở dữ liệu bằng các thủ tục

  3. số nhận dạng oracle ở chế độ ngủ đông quá dài ORA-00972

  4. so sánh nguyên tử và hoán đổi trong cơ sở dữ liệu

  5. Cần trợ giúp với kết nối cơ sở dữ liệu và mã truy vấn