Newsgroup: it.comp.software.database
Titolo: Non ordinare una query

Ciao, ho una query che ha come condizione un elenco
di record da prelevare senza effettuare nessun ordinamento.
SELECT * FROM tabella WHERE ID in (100,300,200)
vorrei il risultato :
100
300
200
mentre ottengo l'ordinamento per ID, quindi
100
200
300
Qualche consiglio?
Grazie e buone feste a tutti
Luke

 di record da prelevare senza effettuare nessun ordinamento.
"Senza nessun ordinamento" per il database significa che l'ordinamento
non ti interessa, quindi non te ne garantisce uno.
Da quello che dici invece sembra che un certo tipo di ordinamento ti
interessi. La domanda è: quale?

 Luke
Bye
-- 
Luca Bianchi
Microsoft MVP - SQL Server
http://blogs.aspitalia.com/lucabianchi/
http://mvp.support.microsoft.com

 :
|| "Senza nessun ordinamento" per il database significa che
|| l'ordinamento non ti interessa, quindi non te ne garantisce uno.
|| Da quello che dici invece sembra che un certo tipo di ordinamento ti
|| interessi. La domanda č: quale?
la query deve restituire i record nella sequenza
in cui li ho elencati con la clausola WHERE id IN (100,300,200)
grazie
luke

 :
|| ...il primo è quello di specificare il database a cui ti riferisci.
hai ragione,scusami, sto usando MySql
|| In secondo luogo, a prescindere dal database che utilizzi, senza
|| specificare una clausola ORDER BY non hai alcun controllo
|| sull'ordinamento che ti viene restituito ed anche il fatto che ti
|| vengano restituiti ordinati in maniera crescente è del tutto
|| casuale.
ottengo l'ordinamento di inserimento ed essendo la query
basata su chiave "id" vengono ordinati in ordine crescente
(ovviamento per chiave diversa avrei ottenuto un ordinamento
 differente)
|| A seconda del piano che il sistema decide di utilizzare per
|| soddisfare la query il risultato, in termini di ordinamento,
|| potrebbe variare. Una soluzione in grado di raggiungere il tuo
|| obiettivo è quella di popolare una tabella (temporanea o permanente)
|| con i valori da ricercare dove sia anche presente un ulteriore campo
|| che mi dia informazioni sul "ranking". Quindi qualcosa di simile a
grazie per il consiglio e soprattutto per il codice
forse avrei dovuto spiegare meglio l'obiettivo della
query:
selezionare da una tabella di notizie, solo le notizie
contenute nell'elenco fornito, nell'ordine specificato
dall'elenco fornito
(l'elenco fornito è composto da id separati da virgole)
|| Bye
||
|| --
|| Luca Bianchi
|| Microsoft MVP - SQL Server
|| 
http://blogs.aspitalia.com/lucabianchi/
|| 
http://mvp.support.microsoft.com
ancora grazie
e ciao
luke

 query:
...questo lo avevo intuito dall'esempio che avevi proposto e ti ribadisco 
che non esiste una clausola simile a
WHERE campo IN (valore1, valore2, ecc ORDERED)
e che l'unico modo per avere i dati ordinati è quello di specificare IN 
MANIERA ESPLICITA una clausola di ordinamento. Se non esiste un'altra 
discriminante per cui il valore 300 debba seguire 100 ma precedere 200 (ad 
esempio una data di inserimento) l'unico modo per raggiungere il tuo 
obiettivo è quello di indicare una sequenzialità. Attraverso lo script che 
ho indicato nel precedente post oppure in maniera simile a
SELECT ID, 1 AS rank FROM Tabella WHERE ID = 100
UNION ALL
SELECT ID, 2 FROM Tabella WHERE ID = 300
UNION ALL
SELECT ID, 3 FROM Tabella WHERE ID = 200
ORDER BY 2
La soluzione di cui al precedente post si mostra più flessibile quando non 
sei in grado di conoscere preventivamente il numero dei record che vuoi 
ottenere (o meglio il numero degli ID); questa se sai che vuoi ottenere un 
numero fisso (in questo caso 3) di ID. In ogni caso è d'obbligo una clausola 
di ordinamento.


 in cui li ho elencati con la clausola WHERE id IN (100,300,200)
L'istruzione IN non fornisce alcuna direttiva per l'ordinamento.
Devi seguire un'altra strada: per esempio, invece di mettere le
restrizioni in un elenco di valori, puoi mettere gli stessi valori in
una tabella temporanea, o in una vista, in cui specifichi una ulteriore
colonna che determina il ranking. Quindi mettere in join questa tabella
e specificare l'ordinamento sulla colonna ranking tramite la clausola
order by.

 
[in oracle]
select * from tabella where id in (100,300,200)
order by decode(id,100,1,300,2,200,3,4)
Ciao
Matteo

 :
|| [in oracle]
||
|| select * from tabella where id in (100,300,200)
|| order by decode(id,100,1,300,2,200,3,4)
Grazie a tutti per le risposte, a dire il vero cercavo
una soluzione semplice come quella che offre
Oracle , cercherò un sistema seguendo i consigli di
Luca Bianchi e Vincent Vega
Bye
Luke
[ 
www.vastosansalvo.it
 ]


non esiste in Mysql la decode?

> Torakiki

 No, forse si potrebbe "sostituire" con una CASE?
In SQL Server utilizzerei un approccio del genere:
SELECT *
FROM Tabella
WHERE ID IN(100, 300, 200)
ORDER BY
CASE ID
    WHEN 100 THEN 1
    WHEN 300 THEN 2
    WHEN 200 THEN 3
    ELSE 4
END;
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org

 :
|| Torakiki wrote:
|||| non esiste in Mysql la decode?
|||
||| No, forse si potrebbe "sostituire" con una CASE?
||
|| In SQL Server utilizzerei un approccio del genere:
||
|| SELECT *
|| FROM Tabella
|| WHERE ID IN(100, 300, 200)
|| ORDER BY
|| CASE ID
||    WHEN 100 THEN 1
||    WHEN 300 THEN 2
||    WHEN 200 THEN 3
||    ELSE 4
|| END;
||
|| Ciao!
grazie ancora, secondo voi, tra le varie proposte,
qual'è la più efficiente ? diciamo che gli id potrebbero
essere 10 ma anche 20 in certi casi
bye
luke

 qual'è la più efficiente ?
Ciao luke,
probabilmente la soluzione proposta da Luca bastata su una tabella di
ranking da mettere i join con la tabella principale.
Fai alcune prove e scopri tu stesso qual è la soluzione più efficiente.
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

 :
|| Ciao luke,
||
|| probabilmente la soluzione proposta da Luca bastata su una tabella di
|| ranking da mettere i join con la tabella principale.
|| Fai alcune prove e scopri tu stesso qual č la soluzione piů
|| efficiente.
benissimo, avevo trovato una soluzione poco elegante,
vedrň di sfruttare i consigli suggeriti per rendere la
procedura piů efficiente, altrimenti a cosa serve un
newsgroup  ?
grazie a tutti
luke