Newsgroup: it.comp.software.database
Titolo: Sql Server, UNION e ORDER BY

Mi trovo a dover fare una cosa del tipo
SELECT        TOP 5 
libri.id
, libri.autore, libri.titolo, COUNT(
editori.id
)
AS conteggio_edizioni, 1 AS rilevanza
FROM          libri INNER JOIN
                     editori ON 
libri.id
=editori.libro_id
WHERE        libri.autore='filippo'
                    AND 
libri.id
<33
GROUP BY  
libri.id
, libri.autore, libri.titolo, rilevanza
UNION
SELECT        TOP 5 
libri.id
, libri.autore, libri.titolo, COUNT(
editori.id
)
AS conteggio_edizioni, 1 AS rilevanza
FROM          libri INNER JOIN
                     editori ON 
libri.id
=editori.libro_id
WHERE        libri.autore>'filippo'
GROUP BY  
libri.id
, libri.autore, libri.titolo, rilevanza
Vorrei ordinare il set di risultati così:
ORDER BY rilevanza DESC, libri.autore, 
libri.id
 DESC
però così ordina solamente la seconda SELECT dell'UNION.
Ho provato a mettere il numero cardinale dei campi... niente.
Ho provato ad aggiungere l'ORDER BY anche sulla prima SELECT... errore.
Ho provato a fare una cosa del tipo SELECT * FROM( SELECT ... FROM ... UNION
SELECT ... FROM ...) ORDER BY ... errore pure questa.
Che possibilità mi rimangono? Sulla guida in linea di SQL Server non dice
niente di particolare!

 niente di particolare!
Apri i Books Online (BOL) di SQL Server, seleziona il menu GO, URL... ed
incolla il seguente link:
tsqlref.chm::/ts_sa-ses_0gbp.htm
Ti apparirà la pagina di help relativa alla clausola ORDER BY dove viene
riportato che:
"The ORDER BY clause can include items not appearing in the select list.
However, if SELECT DISTINCT is specified, or if the SELECT statement
contains a UNION operator, the sort columns must appear in the select list.
Furthermore, when the SELECT statement includes a UNION operator, the column
names or column aliases must be those specified in the first select list."
Ti allego una query simile alla tua, utilizzando il database di esempio Pubs
fornito con SQL Server:
USE Pubs
GO
SELECT TOP 5 T.title_id, T.price, T.title, COUNT(T.pub_id)
conteggio_edizioni, 1 rilevanza
FROM dbo.titles T JOIN dbo.publishers P
ON T.pub_id = P.pub_id
WHERE T.price < 10
GROUP BY T.title_id, T.price, T.title
UNION
SELECT TOP 5 T.title_id, T.price, T.title, COUNT(T.pub_id)
conteggio_edizioni, 1 rilevanza
FROM dbo.titles T JOIN dbo.publishers P
ON T.pub_id = P.pub_id
WHERE T.price >= 10
GROUP BY T.title_id, T.price, T.title
ORDER BY rilevanza DESC, T.price, T.title_id
Ciao!
--
Lorenzo Benaglia
UGIdotNET - 
http://www.ugidotnet.org
UGISS - 
http://www.ugiss.org

 ORDER BY rilevanza DESC, T.price, T.title_id
E' proprio il caso mio, ma ti assicuro che non funziona, ordina solo la
seconda SELECT.
Tanto per la cronaca, uso Sql Server 7 + SP3.

 Tanto per la cronaca, uso Sql Server 7 + SP3.
Io utilizzo SQL Server 2000 SP2 ma il comportamento è il medesimo anche in
SQL Server 7.0.


 Tu ottieni un risultato differente?
No. Il risultato è lo stesso, ma il mio problema è diverso:
l'ordinamento del risultato effettivamente avviene come da clausola ORDER
BY, ma il comportamento della prima SELECT TOP non è subordinato alla stessa
ORDER BY. Tant'è vero che se eseguo la prima SELECT distaccandola dalla
seconda ottengo un risultato differente.
And now?

...
credo che cosi' come hai fatto la query te li ordina gia' secondo
l'ordine dei campi che hai selezionato (questo perche' UNION rimuove
duplicati, e questa operazione implica prima un ordinamento)
d'altra parte i metodi da te scelti mi sembrano corretti (in
particolare la select * from (subquery) order by ..., anzi e' prorio
il metodo che ti avrei consigliato)
per ordinare puoi usare anche la group by (questo perche' e' implicito
un ordinamento per raggruppare i campi, in Oracle si usa se vuoi una
vista ordinata dato che non e' possibile usare la order by nella query
di una vista)
spero di averti dato qualche utile indicazione, anche se non specifica
per sql-server
Greetings,
Alessandro Trebbi
Pesaro, Italy
http://www.b3soft.com


 seconda ottengo un risultato differente.
Trovato!!!
http://groups.google.it/groups?hl=it&lr=&ie=UTF-8&oe=UTF-8&threadm=99guui%24
epa%241%
40newsmaster.axxent.ca
&rnum=10&prev=/groups%3Fhl%3Dit%26lr%3D%26ie%3
DUTF-8%26oe%3DUTF-8%26q%3Dsql%2Bselect%2Btop%2Bunion%2Border%2Bby%26spell%3D
1
E' effettivamente una limitazione di Sql Server, aggirabile come illustrato
nel thread.
Grazie a tutti, cmq!

 Grazie a tutti, cmq!
Di niente.
