Newsgroup: it.comp.software.database
Titolo: dubbio su sql

con sql server
ho un'amenesiaz
ma il group by
non dovrebbe funzionare a prescindere?
cioè, devo mostare un valore preso da una tabella, che però devo ordinare per un campo di un'altra tabellaz
più o - così
SELECT tab1.nome
FROM tab1, tab2, tab3
WHERE condizionivarieperunirele3tabelle
GROUP BY 
tab2.id
,tab1.nome ORDER BY 
tab2.id
,tab1.nome
così funziona, ma mi ripete i risultati, dato che con il campo nome possono esserci più valori identici che differiscono per 
tab2.id
indi volevo cmq ordinarli per 
tab2.id
, che sarebbe l'importanza
ma mostrarne un solo tab2.nome, senza doppioni
non so se mi spiego (cit.) 
mi pare che con mysql non ci fossero tutti questi problemiz
(se non ricordo male)
qui appena metto un order by altrocampo, mi dice che non fa parte del group
col distinct istess problemi
como si fa?
sono nel pallone, dovrebbe essere una scematina
-- 
SCIRIO - La quantità che compensa la qualitàz
http://scirio.altervista.org
http://ihu.altervista.org
http://x-privat.org
 
http://scirio.altervista.org/cinema/
8 9 2 Z - 8 9 2 Z - 100% COMMERCIALE

 non so se mi spiego (cit.) 
modificale cosi':
SELECT DISTINCT tab1.nome
...

 .... 
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.


 ma mostrarne un solo tab2.nome, senza doppioni
Ciao Scirio,
i Books Online riportano:
"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".
Paragrafo SELECT
http://msdn.microsoft.com/library/en-us/tsqlref/ts_sa-ses_9sfo.asp
E la cosa mi sembra sensata.
tab1.nome è il risultato di una aggregazione, quindi se raggruppi per
tab1.nome non esiste più una corrispondenza 1 a 1 con 
tab2.id
, pertanto
com'è possibile ordinare per 
tab2.id
?!
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

 
bè facciamo un esempio concreto
io devo associare dei ruoli (che ordino per id) a dei nomi
ruolo1,ruolo2,ruolo3
ogni nome può avere più ruoli
io voglio tirare fuori i singoli nomi, ordinati per ordine di ruolo
per esempio se inserisco
pippo=ruolo1
pippo=ruolo2
antonio=ruolo3
antonio=ruolo1
rocco=ruolo1
poi vorrei avere la lista dei nomi 'usati', ovvero che hanno un ruolo
ordinata per il primo ruolo inserito, saltando tutti gli altri ruoli ad esso associata
ovvero
pippo
antonio
rocco
quindi è come se dovessi mettere una TOP (limit) per avere il singolo nome


"scirio" <sci...@posta.poco> ha scritto nel messaggio
news:42ef30fe$1...@newsgate.x-privat.org...
da quello che ho capito seguendo il thread ti serve qualcosa del genere
----
 SELECT tab1.nome
 FROM tab1, tab2, tab3
 WHERE condizionivarieperunirele3tabelle
 GROUP BY tab1.nome
 ORDER BY Min(
tab2.id
),tab1.nome
----
Ciao
-- 
Giorgio Rancati
[Office Access MVP]

 ruolo1,ruolo2,ruolo3
Posta la struttura delle tabelle (CREATE TABLE...), alcune righe di prova
(INSERT INTO...) e spiega dettagliatamente quello che vuoi fare...


 ----
così da errore
la soluzione di ean sembra funzionare
 SELECT tab1.nome, min(
tab2.id
)
FROM tab1, tab2, tab3
WHERE condizionivarieperunirele3tabelle
GROUP BY tab1.nome ORDER BY min(
tab2.id
),tab1.nome 
avevo provato anche a mettere min nella conzione del where che legava l'id :p


 così da errore
cosa stai dicendo Willy ?


 
lolz
è vero, mi dava qualcosa di aggregate non ricordo bene, avevo già provato
se non erro il min nell'order non te lo fa fare perchè non ce l'hai nel select o non è raggruppato
cmq ho risolto con la tecnica ean
però non vorrei dire una cacchiata, ma con mysql lasciava raggruppare senza indugio, me pare


 però non vorrei dire una cacchiata, ma con mysql lasciava raggruppare
senza indugio, me pare
è una cosa diversa,  l'SQL standard prevede di indicare i campi non
sottoposti a funzioni di
aggregazione nella group By.
MySql ti permette di farlo se non lo usi in modalità ANSI.
------------------
MySQL extends the use of GROUP BY so that you can use columns or
calculations in the SELECT list that don't appear in the GROUP BY clause.
http://dev.mysql.com/doc/mysql/en/GROUP-BY-hidden-fields.html
------------------
ma devi fare attenzione a questa nota menzionata nell'help
----
Do not use this feature if the columns you omit from the GROUP BY part are
not unique in the group! You get unpredictable results.
----


 
si il tuo script funziona
ma nel mio caso
mi da
Column 'nome' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
mi da errore con tutte e 3 le query da te usate
così invece no
SELECT MIN(
tab3.id
),tab2.nome
FROM tab1, tab2, tab3
WHERE tab3.id4="&id4&" AND tab3.id3="&id3&" AND tab3.id2=
tab2.id
 AND 
tab1.id
=
tab3.id
 
GROUP BY tab2.nome ORDER BY MIN(
tab3.id
),tab2.nome
penso sia per il fatto che ci siano più relazioni
nel mio caso, diciamo che ho una sorta di riassunto, gli ultimi tot nominativi con un determinato id associato, tralasciando i nominativi riassociati ad altri id
nella pagina dei dettagli invece, mostro tutto e non ci sono problemiz


 an aggregate function and there is no GROUP BY clause.
purtroppo mi accorgo solo adesso dell' XPost su it.test
non intendo alimentare questo thread che mi puzza di trollata
:-)


 
puoi anche toglierloz, di solito lo metto per comodità, per non stare a sottoscrivere i gruppi di passaggioz
quello l'ho cmq temporaneamente messo, quindi se ti senti più sicuro rispondi solo di laz :)
-- 
SCIRIO - 100% COMMERCIALE - 8 9 2 Z - 8 9 2 Z
http://scirio.altervista.org
http://ihu.altervista.org
http://x-privat.org
 
http://scirio.altervista.org/cinema/
Basta con la guerra a Gaza, via i Palestinesi dalla Palestinaz!

GROUP BY tab2.nome ORDER BY MIN(
tab3.id
),tab2.nome
e questa invece
----
SELECT tab2.nome
FROM tab1, tab2, tab3
WHERE tab3.id4="&id4&" AND tab3.id3="&id3&" AND tab3.id2=
tab2.id
 AND 
tab1.id
=
tab3.id
GROUP BY tab2.nome ORDER BY MIN(
tab3.id
),tab2.nome
-----
ti dà l'errore
----
Column 'nome' is invalid in the select list because it is not contained in 
an aggregate function and there is no GROUP BY clause.
----
be, è molto interessante che ti dica che la colonna nome non è nella Group 
By quando c'è non ti pare ?
puoi postare uno script con la DDL delle tabelle e qualche dato per 
riprodurre il problema ?


Il 2 Ago 2005 16:58:52 stavo sfottendo peppinoz, perchè non sa usare scisland (lo migliore sito per postare via webz), quando tu, giorgio rancati (dal cliente)z (
giorgio_n...@tiscali.it
), hai dettoz:

scusa la domanda da niubbo, ma cos'è una ddl?
la struttura?
domani provo a ricreare uno script che crea una tabella simile all'originale
o meglio 3 tabelle, dato che ne uso 3, con solo i campi interessatiz



Ok.
Ciao
