Aiuto per query dove il WHERE è un'altra query

di il
38 risposte

38 Risposte - Pagina 3

  • Re: Aiuto per query dove il WHERE è un'altra query

    Infatti se la query che ho scritto io fosse quella che mi fa raggiungere lo scopo non avrei aperto questo 3d.
    La devo modificare in modo che se un allievo per una determinata disciplina oltre alla bocciatura o assenza ha un voto maggiore di 17, venga escluso.

    Quello di contare i voti non è una soluzione perchè posso prendere 17, poi 15 e poi essere assente comunque ho più voti ma comunque ho una pendenza.
    La logica da seguire è quella di lavorare sul valore massimo dei voti.

    Ho provato a selezionare "totali" dal menù progettazione della query, impostando su "max" il campo voti ma ancora non riesco a ottenere quello che voglio.
  • Re: Aiuto per query dove il WHERE è un'altra query

    Seguendo il tuo ragionamento, Avevo pensato anche io alla somma, ma poi dovresti dividere il risultato per la quantità dei voti, se poi hai anche valore negativi tutto si complica. L unica via e modificare la struttura del database mettendo un ulteriore campo.
    Quello che vuoi fare, si fa, ma dovresti andare giù pesantemente con il vb perché non risolvi con una query. Query che non puoi costruire con la wizard query.
  • Re: Aiuto per query dove il WHERE è un'altra query

    Maxs84, procedi per gradi, separa le varie condizioni realizzando delle query specifiche in modo da visionare le singole selezioni dei dati, che poi metterai in relazione fra loro in base alle esigenze.
    Praticamente utilizza l'intefaccia grafica (QBE) in tal modo potrai visionare i risultati e la query implementata nel linguaggio SQL.
    Ad esempio per determinare chi non aveva all'esame il 18 (voto<18) ma poi lo ha superato (voto>=18) è sufficiente porre l'alunno con le materie ed i voti conseguiti, in modo da avere il massimo ed il minimo di ciscun esame in quella materia.
    Chi non ha il massimo maggiore o uguale a 18 non ha superayto l'esame.
    Poi vi sono gli Allievi dei Corsi che sono o meno Transitati (in base a Vero o Falso dell'attributo).
    Similarmente vi saranno Allievi dei Corsi che siano o meno stati Dimessi (Dimissionario=Vero o Falso).

    Quando hai implementato le singole selezioni, metti in relazione (in base alle chiavi) le varie query e tramite una ulteriore query puoi presentare le varie condizioni fra loro correlate.
  • Re: Aiuto per query dove il WHERE è un'altra query

    willy55 ha scritto:


    Maxs84, procedi per gradi, separa le varie condizioni realizzando delle query specifiche in modo da visionare le singole selezioni dei dati, che poi metterai in relazione fra loro in base alle esigenze.
    Praticamente utilizza l'intefaccia grafica (QBE) in tal modo potrai visionare i risultati e la query implementata nel linguaggio SQL.
    Ad esempio per determinare chi non aveva all'esame il 18 (voto<18) ma poi lo ha superato (voto>=18) è sufficiente porre l'alunno con le materie ed i voti conseguiti, in modo da avere il massimo ed il minimo di ciscun esame in quella materia.
    Chi non ha il massimo maggiore o uguale a 18 non ha superayto l'esame.
    Poi vi sono gli Allievi dei Corsi che sono o meno Transitati (in base a Vero o Falso dell'attributo).
    Similarmente vi saranno Allievi dei Corsi che siano o meno stati Dimessi (Dimissionario=Vero o Falso).

    Quando hai implementato le singole selezioni, metti in relazione (in base alle chiavi) le varie query e tramite una ulteriore query puoi presentare le varie condizioni fra loro correlate.
    Giusto. Ma per me è una toppa troppo grossa, che potrebbe essere risolta mettendo un ulteriore campo e gestendo eventuali null. Secondo me la via più semplice è risolvere il problema a livello di struttura.
    Alla fine sono 10 secondi per l aggiunta del campo, 1 minuto per creare una semplice query di selezione, ed un ora per aggiornare manualmente il campo aggiunto.
  • Re: Aiuto per query dove il WHERE è un'altra query

    Non mi trovo d'accordo nell'inserire un dato ridondante che può essere estrapolato dai dati presistenti con una query di selezione, e ciò non solo per i limiti stabiliti delle tre forme normali ma perchè la duplicazioni delle informazioni può comportare disallinamenti e necessità di ulteriori elementi di controllo con tempi più lenti nelle operazioni.
  • Re: Aiuto per query dove il WHERE è un'altra query

    willy55 ha scritto:


    Non mi trovo d'accordo nell'inserire un dato ridondante che può essere estrapolato dai dati presistenti con una query di selezione, e ciò non solo per i limiti stabiliti delle tre forme normali ma perchè la duplicazioni delle informazioni può comportare disallinamenti e necessità di ulteriori elementi di controllo con tempi più lenti nelle operazioni.
    Giusta osservazione, ma, tralasciando il fatto che la struttura non sembra essere tutta, nemmeno in 2 regola formale, non si tratta di un campo fine a se stesso, ma che rende univoco lo stato dello studente. Promosso o bocciato. Cosa che ora non lo è. Inoltre snellisce anche le ricerche, perché con un unica query andrebbe a controllare solo il valore del campo promosso e bocciato, senza eseguire come minimo 4 query ed un filtro (deduco a naso). Cosa da ripetersi ogni volta che abbia la necessità di usare il campo voto per altri tipi di ricerche.
    Gia ora si trova in una situazione veramente a rischio di incoerenza, perché se per sapere se uno studente è promosso e bocciato deve fare tutti questi giri, qualcosa non va.
    Se non ho capito male, ora immette il valore -1 nel campo voto, per indicare se lo studente è assente o non si è presentato.
    Se cosi fosse, è proprio un uso snaturato del campo voto e sopratutto crea dati imcoerenti che dovranno essere ulteriormente filtrati. Il campo voto non può essere un campo di controllo, ma un valore legato solo ad uni stato di anagrafica dello studente.
    In più, lui ha dei campi check box che potrebbero essere eliminati se avesse un campo di stato dello studente, con i valori ad esempio, bicciato, promosso trasferito, assente , svenuto durante l esame
    Quindi in realtà con un campo di stato, andrebbe ad eliminare campi superflui.
    Senza considerare che se un domani il ministero dovesse cambiare il sistema di voto ed invece che in 30esimi, esprimerlo in 100 centesimi (possibilità molto plausibile), praticamente risulterebbero tutti bocciati e in quel caso non basterebbero query di selezione o modificare i valori minimi e massimi in tutte le query, ma bisognerebbe modificare tutti i voti, oppure aggiungere nuove query che filtrino i vecchi risultati con quelli nuovi in aggiunta a quelle che ha deve creare ora. Se poi dovessero sostituire il numerico con le lettere praticamente sarebbe più semplice castrarsi con un paio di mattoni.
    Avere decine di query solo per sapere se uno studente è bocciato. Per me, come disse quello che si appicco per i piedi, non è il verso giusto.

    Comunque per il mio modo di ragionare, usare voto che non è univoco, per determinare lo stato di uno studente è come spegnere ed accendere tutte le luci di un palazzo o di un singolo appartamento, avvitando e svitando tutte le lampadine invece che usare degli interrutori.
  • Re: Aiuto per query dove il WHERE è un'altra query

    willy55 ha scritto:


    Non mi trovo d'accordo nell'inserire un dato ridondante che può essere estrapolato dai dati presistenti con una query di selezione, e ciò non solo per i limiti stabiliti delle tre forme normali ma perchè la duplicazioni delle informazioni può comportare disallinamenti e necessità di ulteriori elementi di controllo con tempi più lenti nelle operazioni.
    Nemmeno io.
  • Re: Aiuto per query dove il WHERE è un'altra query

    fratac ha scritto:


    willy55 ha scritto:


    Non mi trovo d'accordo nell'inserire un dato ridondante che può essere estrapolato dai dati presistenti con una query di selezione, e ciò non solo per i limiti stabiliti delle tre forme normali ma perchè la duplicazioni delle informazioni può comportare disallinamenti e necessità di ulteriori elementi di controllo con tempi più lenti nelle operazioni.
    Giusta osservazione, ma, tralasciando il fatto che la struttura non sembra essere tutta, nemmeno in 2 regola formale, non si tratta di un campo fine a se stesso, ma che rende univoco lo stato dello studente. Promosso o bocciato. Cosa che ora non lo è. Inoltre snellisce anche le ricerche, perché con un unica query andrebbe a controllare solo il valore del campo promosso e bocciato, senza eseguire come minimo 4 query ed un filtro (deduco a naso). Cosa da ripetersi ogni volta che abbia la necessità di usare il campo voto per altri tipi di ricerche.
    Gia ora si trova in una situazione veramente a rischio di incoerenza, perché se per sapere se uno studente è promosso e bocciato deve fare tutti questi giri, qualcosa non va.
    Se non ho capito male, ora immette il valore -1 nel campo voto, per indicare se lo studente è assente o non si è presentato.
    Se cosi fosse, è proprio un uso snaturato del campo voto e sopratutto crea dati imcoerenti che dovranno essere ulteriormente filtrati. Il campo voto non può essere un campo di controllo, ma un valore legato solo ad uni stato di anagrafica dello studente.
    In più, lui ha dei campi check box che potrebbero essere eliminati se avesse un campo di stato dello studente, con i valori ad esempio, bicciato, promosso trasferito, assente , svenuto durante l esame
    Quindi in realtà con un campo di stato, andrebbe ad eliminare campi superflui.
    Senza considerare che se un domani il ministero dovesse cambiare il sistema di voto ed invece che in 30esimi, esprimerlo in 100 centesimi (possibilità molto plausibile), praticamente risulterebbero tutti bocciati e in quel caso non basterebbero query di selezione o modificare i valori minimi e massimi in tutte le query, ma bisognerebbe modificare tutti i voti, oppure aggiungere nuove query che filtrino i vecchi risultati con quelli nuovi in aggiunta a quelle che ha deve creare ora. Se poi dovessero sostituire il numerico con le lettere praticamente sarebbe più semplice castrarsi con un paio di mattoni.
    Avere decine di query solo per sapere se uno studente è bocciato. Per me, come disse quello che si appicco per i piedi, non è il verso giusto.

    Comunque per il mio modo di ragionare, usare voto che non è univoco, per determinare lo stato di uno studente è come spegnere ed accendere tutte le luci di un palazzo o di un singolo appartamento, avvitando e svitando tutte le lampadine invece che usare degli interrutori.
    No, il campo -1 (vero) è per la check box che indica eventuale ritiro dell'allievo.
    Se un allievo decide di ritararsi, sulla sua scheda verrà spuntata la casella e inserita la data di dimissioni.
    In questo caso se l'allievo ha delle bocciauture non recuperate non interessa più e per questo non deve essere selezionato dalla query.

    Lo stato dell'allievo esiste e non centra nulla con il voto.

    Infine, se il ministero modificherà il sistema dei voti il problema diventerà diverso, ovvero dovrò modificare parte della struttura del database ma ancora una volta, come per un altro intervento dove parlavi del fatto che l'allievo rifiuta il voto, stai creando un problema che al momento non esiste piuttosto che cercare una soluzione al problema posto.
  • Re: Aiuto per query dove il WHERE è un'altra query

    willy55 ha scritto:


    Maxs84, procedi per gradi, separa le varie condizioni realizzando delle query specifiche in modo da visionare le singole selezioni dei dati, che poi metterai in relazione fra loro in base alle esigenze.
    Praticamente utilizza l'intefaccia grafica (QBE) in tal modo potrai visionare i risultati e la query implementata nel linguaggio SQL.
    Ad esempio per determinare chi non aveva all'esame il 18 (voto<18) ma poi lo ha superato (voto>=18) è sufficiente porre l'alunno con le materie ed i voti conseguiti, in modo da avere il massimo ed il minimo di ciscun esame in quella materia.
    Chi non ha il massimo maggiore o uguale a 18 non ha superayto l'esame.
    Poi vi sono gli Allievi dei Corsi che sono o meno Transitati (in base a Vero o Falso dell'attributo).
    Similarmente vi saranno Allievi dei Corsi che siano o meno stati Dimessi (Dimissionario=Vero o Falso).

    Quando hai implementato le singole selezioni, metti in relazione (in base alle chiavi) le varie query e tramite una ulteriore query puoi presentare le varie condizioni fra loro correlate.
    Onestamente non so fare quello che scrici ma ho già provato a lavorare così:
    -ho creato una query che mi seleziona tutti gli allievi che hanno una bocciatura o sono assenti e che sono ancora presenti a scuola (non dimissionari);
    -ho creato una seconda query che mi seleziona tutti gli allievi promossi e che sono ancora presenti;
    quindi dovrei escludere dalla prima query l'IDAllievo che è presente nella seconda query quando IDDisciplina è uguale, ovvero quando ha già un voto sufficiente per quella materia dove era stato bocciato o assente.
    Questa ultima parte avevo provata a farla inserendo nei criteri della query un "is not exists (select...)"
    Ma non funziona.

    Alla fine ho modificato la prima query in questo modo e sembra funzionare, aspetto che l'utilizzatore del database faccia le sue verifiche e mi dica se i dati ottenuti dalla query corrispondono alla situazione reale:
    SELECT Last(Esami.DataEsame) AS UltimoDiDataEsame, Corsi.Corso, Discipline.Disciplina, Last(SessioniEsami.SessioneEsame) AS UltimoDiSessioneEsame, [cognome] & " " & [nome] AS Allievo, Max(Voti.Voto) AS MaxDiVoto, Last(VotiAllievi.Assente) AS UltimoDiAssente
    FROM ((Corsi INNER JOIN ((Esami INNER JOIN ((((VotiAllievi LEFT JOIN Voti ON VotiAllievi.IDVoto = Voti.IDVoto) INNER JOIN AllieviCorsi ON VotiAllievi.IDAllievoCorso = AllieviCorsi.IDAllievoCorso) LEFT JOIN AllieviAnagrafica ON AllieviCorsi.IDAllievo = AllieviAnagrafica.IDAllievo) INNER JOIN EsamiVerbali ON VotiAllievi.IDEsameVerbale = EsamiVerbali.IDEsameVerbale) ON Esami.IDEsame = EsamiVerbali.IDEsame) INNER JOIN Curricula ON Esami.IDCurricula = Curricula.IDCurricula) ON Corsi.IDCorso = Curricula.IDCorso) INNER JOIN Discipline ON Curricula.IDDisciplina = Discipline.IDDisciplina) INNER JOIN SessioniEsami ON Esami.IDSessioneEsame = SessioniEsami.IDSessioneEsame
    GROUP BY Corsi.Corso, Discipline.Disciplina, [cognome] & " " & [nome], AllieviCorsi.Transitato, AllieviCorsi.Dimissionario
    HAVING (((Max(Voti.Voto))<18) AND ((Last(VotiAllievi.Assente))=False) AND ((AllieviCorsi.Transitato)=False) AND ((AllieviCorsi.Dimissionario)=False)) OR (((Max(Voti.Voto)) Is Null) AND ((Last(VotiAllievi.Assente))=True) AND ((AllieviCorsi.Transitato)=False) AND ((AllieviCorsi.Dimissionario)=False))
    ORDER BY Last(Esami.DataEsame) DESC , Corsi.Corso DESC , Discipline.Disciplina, [cognome] & " " & [nome];
    
    In pratica ho fatto una query di tipo "totali" e come raggruppamento ho scelto "ultimo" su data e su assenza e "max" di voto.
Devi accedere o registrarti per scrivere nel forum
38 risposte