maxs84 ha scritto:
fratac ha scritto:
Non vorrei dire una baggianata, ma mi sembra di capire che la relazione tra allievi corsi e voto è molti ad uno. Quindi otterrai sempre il primo risultato. Che nel caso di un esame superato in seconda battuta sarà la ricerca ti darà sempre bocciato.
Questo perché, se non ho sbagliato ragionamento, hai 2 superchiavi diverse che puntano solo al primo voto ottenuto dello studente, che in caso di bocciatura è minore di 17 e non considera il secondo voto positivo.
Se cosi fosse non avrai solo problemi con questa query, ma con tutte quelle che usano voto come discriminazione.
Dici bene, è impostata uno a molti perchè nella tabella VotiAllievi ci sono più record con lo stesso IDAllievoCorsi della tabella AllieviCorsi.
Così, correggimi se sbaglio, se l'allievo pippo ha 3 insufficienze su 3 esami diversi e quindi sulla tabella VotiAllievi ci saranno 3 record con quel IDAllievoCorsi ma relativi a 3 materie differenti, io nella query le vedrò tutte.
Sbaglio?
In questo modo ho comunque l'univocità del voto dell'allievo "pippo" per la materia "informatica".
Magari questa logica è discutibile e ci saranno tante altre soluzioni migliori comunque "funziona" e comunque ormai il database è stato strutturato così.
NON MODIFICARE LA STRUTTURA O LE RELAZIONI, altrimenti potresti corrompere per sempre il database.
Se fino ad ora ha "Funzionato" bisogna metterci delle pezze.
Per me deve essere una relazione molti a molti, visto che lo stesso esame può essere ripetuto infinite volte con infiniti voti.
ora tu hai un voto collegato ad infiniti corsi.
Forse mi sbaglio ma secondo me ora tu hai.
I numeri tra la parentesi indicato un ipotetico numero ID, che insieme creano una superchiave per ricavare il valore voto(valore atomico)
Primo esame
IDVotiAllievi(1)-- IDAllievoCorsi(1) Voto 17 (valore atomico): Bocciato
ripete l'esame, avrai di nuovo.
IDVotiAllievi(1)-- IDAllievoCorsi(1) Voto 30 (valore atomico): Promosso.
Considerando che la relazione tra votiallievi e allievicorsi è uno a molti con join sinistro (e quindi ricavi tutti i corsi, ma solo i voti allievi che sono uguali) se non mi sono sbagliato nel ragionamento, hai una super chiave identica per due voti diversi.
Fino a quando lo stato è bocciato o promosso il problema non sorge.
Quando invece ti ritrovi con due voti dello stesso studente sullo stesso corso, ti ritrovi nella condizione di avere la stessa chiave ed in teoria, la query riporta solo il primo valore che trova. Che è bocciato.
Quindi non è che il database funziona bene. E' la prima volta che ti sei accorto dell'errore.
Quindi, quale era la domanda iniziale che hai posto?