Perché gli ordinati sono ignorati?
-
12-12-2019 - |
Domanda
Voglio che il mio SQL restituisca tutti i record per una data data, con la più recente in cima (la colonna che sto ordinando per contiene sia data che ora - contiene voci come "21/03/2012 11:48: 04 AM ").
Penserei che il mio SQL (sotto) lo farebbe.Tuttavia, i risultati effettivi ignorano l'elemento del tempo.Sono restituiti in questo modo:
5/21/2012 10:48:04 AM 5/21/2012 10:12:04 AM 5/21/2012 9:48:04 AM 5/21/2012 10:54:04 AM 5/21/2012 11:48:04 AM ....
(iow, i risultati restituiti sono ordinati in modo casuale, per quanto riguarda l'elemento del tempo)
La query è:
SELECT ENTRYDATE ENTERED, ENTEREDBYABC ABC
FROM
SomeTable v
LEFT JOIN SomeTable w ON v.someCol = w.someCorrespondingCol
WHERE
ABC = :abc AND ENTRYDATE = trunc(sysdate)
ORDER BY ENTERED DESC
.
Aggiornamento
Query e risultati più specifici:
Questo (nomi di colonne e tabelle sono stati modificati):
SELECT ENTRYDATE ENTERED, ENTEREDBYABCID ABCID, COMMENTS
FROM
WHITMAN.HOLLOWSKY@ATTORNEY v
LEFT JOIN ABCworker w ON v.enteredbyabcid = w.abcid
WHERE
ABCID = 124393 AND ENTRYDATE = TRUNC(sysdate)
ORDER BY ENTRYDATE desc
.
... Records Records con:
ENTERED ABCID COMMENTS
5/21/2012 1234 At 1:36 PM, ...
5/21/2012 1234 At 1:36 PM, ...
5/21/2012 1234 At 9:23 AM, ...
5/21/2012 1234 At 11:07 AM, ...
5/21/2012 1234 At 11:12 AM, ...
5/21/2012 1234 At 1:42 PM, ...
5/21/2012 1234 At 11:02 AM, ...
5/21/2012 1234 At 9:19 AM, ...
. . .
.
Aggiornato nuovamente
con la query:
select entrydate from WHITMAN.HOLLOWSKY@ATTORNEY order by entrydate desc
.
Io ottengo:
5/21/2012 3:15:50 PM
5/21/2012 3:15:35 PM
5/21/2012 3:15:25 PM
5/21/2012 3:15:25 PM
5/21/2012 3:14:31 PM
5/21/2012 3:14:22 PM
5/21/2012 3:14:11 PM
. . .
.
Iow, funziona bene.
Sia che "entryDate" sia una colonna DateTime - ritengo così, ma non ho privilegi per guardare la struttura del tavolo, quindi ...?
Soluzione
Il tuo ORDER BY
è stato onorato. Il problema è che il componente del tempo su tutte le 11 righe che stai selezionando deve essere mezzanotte per soddisfare il predicato
entrydate = TRUNC(sysdate)
.
la query
SELECT ENTRYDATE ENTERED, ENTEREDBYABCID ABCID, COMMENTS
FROM WHITMAN.HOLLOWSKY@ATTORNEY v
LEFT JOIN ABCworker w ON v.enteredbyabcid = w.abcid
WHERE ABCID = 124393
AND ENTRYDATE = TRUNC(sysdate)
ORDER BY ENTRYDATE desc
.
Chiede tutte le righe in cui entrydate
è oggi a mezzanotte, quindi ordina su entrydate
. Per definizione, poiché esiste un solo valore possibile per entrydate
che soddisfa il predicato, che ORDER BY
è irrilevante. Tutte le 11 righe hanno esattamente lo stesso valore per entrydate
, quindi l'ordinamento su tale valore produce un risultato ordinato arbitrariamente. Oracle potrebbe, proprio correttamente, restituire le 11 righe in qualsiasi ordine e ancora onorare la clausola ORDER BY
.
Forse si desidera ordinare al tempo che viene memorizzato nella colonna comments
anziché al entrydate
. Forse vuoi cambiare il tuo predicato per restituire tutte le righe in cui entrydate
era un po 'di tempo oggi.
AND trunc(entrydate) = trunc(sysdate)
.
Forse vuoi fare qualcos'altro.
Altri suggerimenti
Sospetto che il problema sia che tu abbia una colonna chiamata "inserita" in una delle tabelle che stai unendo.
Di conseguenza, stai ordinando da quella colonna, anche se non è nell'elenco Seleziona.Per risolvere questo problema, dovresti fare una delle seguenti operazioni:
ORDER BY 1
.
o
ORDER BY ENTRYDATE
.
(il secondo essere già stato menzionato nel commento di Glenn.)