2014-05-13 17 views
8

Quando si esegue questa query, i risultati non sono ordinati correttamente.Oracle non si ordina correttamente quando si utilizza la stessa colonna due volte

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

produce:

2576.780243055555555555555555555555555556 
2586.297013888888888888888888888888888889 
2342.294479166666666666666666666666666667 
2617.297476851851851851851851851851851852 
2624.855104166666666666666666666666666667 
2624.855138888888888888888888888888888889 
2624.854236111111111111111111111111111111 
2372.296643518518518518518518518518518519 
2645.257800925925925925925925925925925926 
2403.294756944444444444444444444444444444 
2676.297696759259259259259259259259259259 

Quando la prima linea (SYSDATE - datecolumn una,) viene rimosso, tutto funziona bene. C'è qualche ragione particolare per cui questo sta accadendo?

+0

Provare 'TO_NUMBER (SYSDATE - datecolumn) come sort_column'. Presumo che l'ordinamento con il tuo SQL non è numerico. –

+0

Comportamento interessante (posso confermarlo su Oracle 11gR2). Esistono molti soluzioni, ma sarebbe bello sapere se si tratta di un bug o di una funzionalità. – GoranM

+0

sulla mia interezza tutto funziona come previsto, provare a ricostruire la tabella (ho affrontato problemi di Oracle quando la tabella è corrotta) o fornire un test case completo (con creazione e riempimento della tabella) –

risposta

4

Questo sembra essere un bug. Questo comportamento è simile al bug 8675087, che è apparentemente risolto in 11.2.0.2 - e infatti non posso riprodurre il caso di test per quello. Ma vedo ancora il tuo comportamento in quella versione (su SQL Fiddle) e in 11.2.0.3, quindi questo è simile ma non esattamente lo stesso ...

Se questo ti sta causando un vero problema e non riesci a trovare un soluzione (come lo swapping dell'ordine delle colonne, se la tua sortcolumn è la prima espressione che utilizza sysdate sembra essere OK, ma scambiare colonne nella tua vera query potrebbe non essere conveniente) allora dovresti sollevare una richiesta di servizio con Oracle .

1

Cimice affascinante. Riprodotto su 11.2.0.2.

accade anche se la query è avvolto in una sottoquery:

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

(risultati non ordinato correttamente)

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

(risultati ordinati correttamente)

La migliore soluzione che posso pensare consiste nell'utilizzare una sottoquery scalare per SYSDATE, questo sembra causarne l'ordinamento corretto:

select sysdate - db_created_on a 
     ,(select sysdate from dual) - db_created_on b 
from members 
order by b; 
Problemi correlati