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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top