PDA

View Full Version : Domandona SQL


nothinghr
20-11-2007, 14:14
Qualcuno mi sa spiegare perchè la seguente parte di query potrebbe causare risultati scorretti?
....
Select count(*)
from prenotazioni
group by data
....
Mi è stata corretta nell'esame di Basi di Dati perchè pare che nella target list ci dovrebbe essere data, ma questa cosa mi suona nuova dato che comunque nella select ci deve sempre essere un sottinsieme degli attributi del group.
In particolare poi ne devo fare una media e chi me l'ha corretta sostiene che si potrebbero avere il raggruppamento di righe distinte avente lo stesso valore di count(*)... boh

wingman87
20-11-2007, 14:20
Non ho capito molto, forse se posti il testo dell'esercizio e la struttura della tabella è + chiaro.

manu@2986
20-11-2007, 14:21
"nella select ci deve sempre essere un sottinsieme degli attributi del group."

Forse non ho capito bene, ma se è come dici tu ti sei risposto da solo, nel select non c'è un sottoinsieme degli attributi del group by, anzi, è il contrario.

Comunque, a parte questo, mi pare di ricordare che quando facevo le interrogazioni con access nel campo select dovevo specificare sempre lo stesso attributo (o gli stessi) che usavo nella clausola group by, e usando * mi dava errore.

Comunque potresti postare il testo esatto dell'interrogazione?

nothinghr
20-11-2007, 14:25
"nella select ci deve sempre essere un sottinsieme degli attributi del group."

Forse non ho capito bene, ma se è come dici tu ti sei risposto da solo, nel select non c'è un sottoinsieme degli attributi del group by, anzi, è il contrario.

Comunque, a parte questo, mi pare di ricordare che quando facevo le interrogazioni con access nel campo select dovevo specificare sempre lo stesso attributo (o gli stessi) che usavo nella clausola group by, e usando * mi dava errore.

Comunque potresti postare il testo esatto dell'interrogazione?

guarda che nessun attributo è un sottoinsime di quelli del group ;) (il sottoinsieme vuoto intendo)

nothinghr
20-11-2007, 14:27
Non ho capito molto, forse se posti il testo dell'esercizio e la struttura della tabella è + chiaro.

il testo non l'ho sottomano vado a memoria, comunque la query era banale, qui si tratta di un problema di correttezza dei risultati a dire del prof. a causa della sintassi che ho sopra riportato

Comunque cerco di essere piu' chiaro: ho una tabella in cui ho delle prenotazioni in cui il codice è la chiave li raggruppo per data, li conto e poi nella select principale faccio avg(risultato_vista), impostando la vista come sopra. Il problema a quanto pare è sottile infatti la query è sintatticamente corretta

manu@2986
20-11-2007, 14:40
Direttamente dal mio libro di basi di dati:

Ogni colonna che appare nella lista-select deve anche apparire nella lista-gruppo. La ragione è che ogni riga del risultato dell'interrogazione corrisponde a un gruppo, che è una collezione di righe aventi, nelle colonne menzionate in lista-gruppo, gli stessi valori. In generale, se una colonna appare nella lista-select ma non nella lista-gruppo, possono esserci diverse righe all'interno di un gruppo che in quella colonna hanno valori diversi, e non è chiaro quale di questi valori dovrebbe essere assegnato, nella risposta, alla colonna stessa.

lattone
20-11-2007, 14:44
Tu hai chiesto al compilatore di raggruppare per data una tabella in cui non hai selezionato nessun attributo data.
In questi casi compilatori e professori si comportano alla stessa maniera :cool:

nothinghr
20-11-2007, 14:44
Direttamente dal mio libro di basi di dati:

Ogni colonna che appare nella lista-select deve anche apparire nella lista-gruppo. La ragione è che ogni riga del risultato dell'interrogazione corrisponde a un gruppo, che è una collezione di righe aventi, nelle colonne menzionate in lista-gruppo, gli stessi valori. In generale, se una colonna appare nella lista-select ma non nella lista-gruppo, possono esserci diverse righe all'interno di un gruppo che in quella colonna hanno valori diversi, e non è chiaro quale di questi valori dovrebbe essere assegnato, nella risposta, alla colonna stessa.

Si questa è una cosa arcinota, ma lo capisci che qui è il problema inverso? Ovvero è anche vero il contrario, cioè che l'attributo che appare nel group deve essere nella select? Io non credo, o almeno è quello che ho trovato in esercizi presi da varie facoltà. Mi sono spiegato ora?

nothinghr
20-11-2007, 14:47
Tu hai chiesto al compilatore di raggruppare per data una tabella in cui non hai selezionato nessun attributo data.
In questi casi compilatori e professori si comportano alla stessa maniera :cool:

Che discorso è, l'attributo per cui raggruppi non deve essere necessariamente nella select, è vero il contrario

isAlreadyInUse
20-11-2007, 14:54
The SQL92 standard required that any column referred to in the "group by" must also be specified in the "select" list (among other restrictions).

Secondo lo standard i campi della group by sono richiesti nella selct list

nothinghr
20-11-2007, 14:57
The SQL92 standard required that any column referred to in the "group by" must also be specified in the "select" list (among other restrictions).

Secondo lo standard i campi della group by sono richiesti nella selct list

Ecco, standard del '92 se non erro quindi? Mi domando soltanto perchè molti libri di testo parlano apertamente di sottoinsieme, e molti prof. svolgono query in quel senso.

Quello che segue è preso ad esempio dai lucidi dell'università di Parma:

In ogni interrogazione che usa group by, argomento della select (escludendo l’operatore aggregato) può essere solo un sottoinsieme degli attributi usati nella clausola group by.

il che cozza con quell oche dice lo standard che hai postato

isAlreadyInUse
20-11-2007, 15:00
Magari serve a qualcuno :D
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

manu@2986
20-11-2007, 15:04
Si questa è una cosa arcinota, ma lo capisci che qui è il problema inverso? Ovvero è anche vero il contrario, cioè che l'attributo che appare nel group deve essere nella select? Io non credo, o almeno è quello che ho trovato in esercizi presi da varie facoltà. Mi sono spiegato ora?

" In generale, se una colonna appare nella lista-select ma non nella lista-gruppo, possono esserci diverse righe all'interno di un gruppo che in quella colonna hanno valori diversi, e non è chiaro quale di questi valori dovrebbe essere assegnato, nella risposta, alla colonna stessa."

Ora, tu nella select hai usato * che ti prende tutti gli attributi della tabella, e nel group by hai usato solo data, quindi siamo nel caso che ho scritto qua sopra.

nothinghr
20-11-2007, 15:06
Magari serve a qualcuno :D
http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

credo proprio che quella limitazione sia stata superata nelle versioni successive, ormai la domanda è, va bene non richiamarne alcuno, e vedo che nei forum ricorre questo dubbio, ho postato il problema perchè magari qualcuno si è già posto la domanda e a me serve solo una base certa per protestare:O

nothinghr
20-11-2007, 15:06
" In generale, se una colonna appare nella lista-select ma non nella lista-gruppo, possono esserci diverse righe all'interno di un gruppo che in quella colonna hanno valori diversi, e non è chiaro quale di questi valori dovrebbe essere assegnato, nella risposta, alla colonna stessa."

Ora, tu nella select hai usato * che ti prende tutti gli attributi della tabella, e nel group by hai usato solo data, quindi siamo nel caso che ho scritto qua sopra.

io ho usato count(*) che è tutta un'altra cosa

lattone
20-11-2007, 15:13
Prova ad disegnare l'albero di interrogazione (o come si chiama) della tua query.

{ groupby(data) }
|
{ select{count() }
|
{ from(prenotazioni) }
da leggere dal basso verso l'alto


group by lavora sul risultato della select

manu@2986
20-11-2007, 15:19
ok allora mettiamola così, cosa ti serve portarti dietro tutti gli attributi della tabella per poi calcolarne la media, non ti basta raggruppare per la data? Ammesso che sia giusto come dici tu, anche se non ne sono convinto, che motivo c'è di fare count(*)? nessuno.

nothinghr
20-11-2007, 15:20
ok allora mettiamola così, cosa ti serve portarti dietro tutti gli attributi della tabella per poi calcolarne la media, non ti basta raggruppare per la data? Ammesso che sia giusto come dici tu, anche se non ne sono convinto, che motivo c'è di fare count(*)? nessuno.

ah no? e come le conti le prenotazioni in un determinato giorno?

certo puoi fare anche count(cod) ma è una scrittura simmetrica in questo caso

nothinghr
20-11-2007, 15:24
Prova ad disegnare l'albero di interrogazione (o come si chiama) della tua query.

{ groupby(data) }
|
{ select{count() }
|
{ from(prenotazioni) }
da leggere dal basso verso l'alto


group by lavora sul risultato della select

Forse non ho capito cosa intendi. Secondo il tuo ragionamento se faccio
select camera, count(*)
from prenotazioni
group by data, camera

non funziona? invece funziona eccome, pero' magari ho capito male cosa intendi...

manu@2986
20-11-2007, 15:35
ah no? e come le conti le prenotazioni in un determinato giorno?

certo puoi fare anche count(cod) ma è una scrittura simmetrica in questo caso

Appunto quello che intendevo, quindi se avessi fatto così il prof avrebbe detto che era sbagliato, ma, in sostanza, come la vuole il prof sta interrogazione?

nothinghr
20-11-2007, 15:43
Appunto quello che intendevo, quindi se avessi fatto così il prof avrebbe detto che era sbagliato, ma, in sostanza, come la vuole il prof sta interrogazione?

ah ok scusa non avevo inteso voleva solamente che io facessi

Select data, count(*)
from prenotazioni
group by data

ma è la motivazione che non mi convince te la riassumo cosi': Sintatticamente e' giusta ma funzionalmente no. L'assenza nella target list dell'attributo usato per il raggruppamento (data) puo' portare al raggruppamento di righe distinte per le quali count(*) da' lo stesso valore. Di conseguenza il successivo calcolo del valor medio puo' risultare scorretto.
non capisco proprio perchè mai sql dovrebbe fare quella vaccata.

manu@2986
20-11-2007, 16:10
In effetti in rete trovo molti esempi che sostanzialmente dicono che la tua versione e quella del prof sono equivalenti....

nothinghr
20-11-2007, 16:15
In effetti in rete trovo molti esempi che sostanzialmente dicono che la tua versione e quella del prof sono equivalenti....

menomale, non sono pazzo:stordita: