2014-05-13 13 views
8

Khi tôi chạy truy vấn này, kết quả không được sắp xếp chính xác.Oracle không sắp xếp đúng khi sử dụng cùng một cột hai lần

SELECT 
    SYSDATE - datecolumn a, 
    SYSDATE - datecolumn sortcolumn 
FROM atable 
ORDER BY sortcolumn 

Tạo:

2576.780243055555555555555555555555555556 
2586.297013888888888888888888888888888889 
2342.294479166666666666666666666666666667 
2617.297476851851851851851851851851851852 
2624.855104166666666666666666666666666667 
2624.855138888888888888888888888888888889 
2624.854236111111111111111111111111111111 
2372.296643518518518518518518518518518519 
2645.257800925925925925925925925925925926 
2403.294756944444444444444444444444444444 
2676.297696759259259259259259259259259259 

Khi dòng đầu tiên (SYSDATE - datecolumn một,) được lấy ra, tất cả mọi thứ hoạt động tốt. Có lý do cụ thể nào khiến điều này xảy ra không?

+0

Thử 'TO_NUMBER (SYSDATE - datecolumn) dưới dạng cột_sắp_xếp'. Tôi cho rằng sắp xếp với SQL của bạn không phải là số. –

+0

Hành vi thú vị (Tôi có thể xác nhận nó trên Oracle 11gR2). Có rất nhiều cách giải quyết nhưng nó sẽ là tốt đẹp để biết cho dù đó là một lỗi hoặc một tính năng. – GoranM

+0

trên instaince của tôi tất cả các công việc như mong đợi, cố gắng xây dựng lại bảng của bạn (tôi phải đối mặt với các vấn đề oracle khi bảng bị hỏng) hoặc cung cấp đầy đủ trường hợp thử nghiệm (với bảng tạo và điền) –

Trả lời

4

Điều này có vẻ là một lỗi. Hành vi này trông giống như lỗi 8675087, được cho là cố định trong 11.2.0.2 - và thực sự tôi không thể tạo lại trường hợp thử nghiệm cho điều đó. Nhưng tôi vẫn thấy hành vi của bạn trong phiên bản đó (trên SQL Fiddle) và trong 11.2.0.3, do đó, điều này tương tự nhưng không chính xác như nhau ...

Nếu điều này gây ra sự cố thực sự và bạn không thể tìm thấy giải pháp thay thế cho bạn (như hoán đổi thứ tự cột, nếu sortcolumn là biểu thức đầu tiên sử dụng sysdate thì có vẻ OK, nhưng việc hoán đổi cột trong truy vấn thực của bạn có thể không thuận tiện), bạn nên nâng cao yêu cầu dịch vụ với Oracle .

1

Lỗi hấp dẫn. Đã sao chép trên 11.2.0.2.

Thậm chí xảy ra nếu truy vấn được bọc trong một subquery:

select * from (
    select sysdate - db_created_on a 
     ,sysdate - db_created_on b 
    from members 
) order by b; 

(kết quả không được sắp xếp một cách chính xác)

select * from (
    select sysdate - db_created_on a 
     ,sysdate - db_created_on b 
    from members 
) order by a; 

(kết quả được sắp xếp một cách chính xác)

Cách giải quyết tốt nhất mà tôi có thể nghĩ là sử dụng truy vấn con vô hướng cho SYSDATE, điều này có vẻ khiến nó phân loại chính xác:

select sysdate - db_created_on a 
     ,(select sysdate from dual) - db_created_on b 
from members 
order by b; 
Các vấn đề liên quan