Perchè Access scambia i record ?

di il
11 risposte

Perchè Access scambia i record ?

Buongiorno, 

nel debuggare la mia applicazione mi sono accorto di questo comportamento di access che vorrei capire.

Ho questa tabella

Nell'applicazione c'è la query seguente

che una volta lanciata fa apparire

In pratica scambia quella che in tabella (in alto) è la terza riga (con QtaRichiesta = 1000) con la penultima.

Il codice di magazzino è lo stesso per le due righe (MEA20002).

Non capisco il motivo di questo scambio, mi aspetto che le due righe rimangano in ordine di inserimento (quindi in ordine di ID) avendo fatto un ordinamento per codice di magazzino.

Se nella query tolgo la clausola ORDER BY le righe non vengono scambiate.

Non è un problema, ma vorrei capire come ragiona Access, perchè fa queste operazioni ?.

Grazie

Ste

11 Risposte

  • Re: Perchè Access scambia i record ?

    Poiche' i codici magazzino sono uguali e tu ordini SOLO per codice magazzino, l'ordine risultante di 2 (o piu') record con la stessa chiave e' INDETERMINATO, e dipende dall'implementazione interna dell'algoritmo ma anche da un'infinita' di altre condizioni come ad esempio la posizione FISICA del record nello storage che sta su disco che NON NECCESSARIAMENTE rispecchia l'ordine di inserimento, perche' Access cerca di ottimizzare anche lo spazio su disco utilizzato.

    Questo e' vero per TUTTI i DBMS non solo per Access.

    Se ti serve un particolare ordinamento, lo DEVI OTTENERE mediante una ORDERBY e NON affidarti al fatto che per colpo di C. l'ordine ritornato  dalla SELECT e' esattamente quello che ti aspetti, perche' questo puo' cabiare ARBITRARIAMENTE in ogni momento.

    Access ti ASSICURA di rispettare l'ORDERBY che hai specificato, per il resto fa quello che vuole.

    ATTENZIONE: questa logica e' altrettnto valida per l'ORDINE delle COLONNE.

    NON FIDARTI dell'ordine ritornato da “SELECT *”, NON E' DETTO che l'ordine rimanga quello SEMPRE! Se ti serve un ordine specifico, indicalo ESPLICITAMENTE

    Prevenire e' meglio che curare ;-)

  • Re: Perchè Access scambia i record ?

    Aggiungo:

    in questa tabella con più voci 

    quando ho aggiunto la riga con la freccia rossa, in questa query mi è apparsa prima della riga sopra con QtaRichiesta 400pz e stesso CodComp.

    Avendo poi aggiunto la riga con la freccia verde, ecco che la riga con la freccia rossa rimane sotto l'altra rispettando l'ordine di inserimento.

    In pratica questo scambio avviene solo con il contenuto dell'ultima riga se in tabella appare un'altra riga con lo stesso CodComp.

  • Re: Perchè Access scambia i record ?

    Si chiama ‘colpo di fortuna’ ;-)

    (Sarebbe ‘colpo di c…’ ma evitiamo le volgarita' ;-) )

  • Re: Perchè Access scambia i record ?

    28/06/2023 - migliorabile ha scritto:


    Poiche' i codici magazzino sono uguali e tu ordini SOLO per codice magazzino, l'ordine risultante di 2 (o piu') record con la stessa chiave e' INDETERMINATO, e dipende dall'implementazione interna dell'algoritmo ma anche da un'infinita' di altre condizioni come ad esempio la posizione FISICA del record nello storage che sta su disco che NON NECCESSARIAMENTE rispecchia l'ordine di inserimento, perche' Access cerca di ottimizzare anche lo spazio su disco utilizzato.

    Questo e' vero per TUTTI i DBMS non solo per Access.

    Se ti serve un particolare ordinamento, lo DEVI OTTENERE mediante una ORDERBY e NON affidarti al fatto che per colpo di C. l'ordine ritornato  dalla SELECT e' esattamente quello che ti aspetti, perche' questo puo' cabiare ARBITRARIAMENTE in ogni momento.

    Access ti ASSICURA di rispettare l'ORDERBY che hai specificato, per il resto fa quello che vuole.

    ATTENZIONE: questa logica e' altrettnto valida per l'ORDINE delle COLONNE.

    NON FIDARTI dell'ordine ritornato da “SELECT *”, NON E' DETTO che l'ordine rimanga quello SEMPRE! Se ti serve un ordine specifico, indicalo ESPLICITAMENTE

    Chiarissimo, pensavo invece che a parità di chiave di ordinamento rispettasse l'ordine di inserimento, ovvero di ID.

    Grazie mille

  • Re: Perchè Access scambia i record ?

    28/06/2023 - migliorabile ha scritto:


    Si chiama ‘colpo di fortuna’ ;-)

    (Sarebbe ‘colpo di c…’ ma evitiamo le volgarita' ;-) )

    Beh, però è bravo a fare sistematicamente questa cosa… 

    A questo punto aspetto di avere il colpo di Q e vedere i dati nell'ordine giusto, anche perchè sono due giorni che faccio prove e non ha mai mancato di scambiarmi i dati.

    Grazie

  • Re: Perchè Access scambia i record ?

    28/06/2023 - StackPtr ha scritto:


    Non capisco il motivo di questo scambio, mi aspetto che le due righe rimangano in ordine di inserimento (quindi in ordine di ID) avendo fatto un ordinamento per codice di magazzino.

    Ciao,

    ciò che devi aspettarti è quello che fa la query e non quello che tu pensi… è un po' diverso.

    Inserisci ID e lo ordini per ID se vuoi ottenere un ordinamento sulla base dell'inserimento dei records. Altre strade ti portano ad altri risultati non congrui per il tipo di ordinamento che vuoi ottenere.

    Se poi ID non lo vuoi vedere nella query, togli la spunta di visualizzazione e sei a posto.

  • Re: Perchè Access scambia i record ?

    28/06/2023 - StackPtr ha scritto:


    Aggiungo:

    in questa tabella con più voci 

    quando ho aggiunto la riga con la freccia rossa, in questa query mi è apparsa prima della riga sopra con QtaRichiesta 400pz e stesso CodComp.

    Avendo poi aggiunto la riga con la freccia verde, ecco che la riga con la freccia rossa rimane sotto l'altra rispettando l'ordine di inserimento.

    In pratica questo scambio avviene solo con il contenuto dell'ultima riga se in tabella appare un'altra riga con lo stesso CodComp.

    Come inserisci il record? Che comando usi?

  • Re: Perchè Access scambia i record ?

    28/06/2023 - StackPtr ha scritto:


    Buongiorno, 

    nel debuggare la mia applicazione mi sono accorto di questo comportamento di access che vorrei capire.

    Ho questa tabella

    Nell'applicazione c'è la query seguente

    che una volta lanciata fa apparire

    In pratica scambia quella che in tabella (in alto) è la terza riga (con QtaRichiesta = 1000) con la penultima.

    Il codice di magazzino è lo stesso per le due righe (MEA20002).

    Non capisco il motivo di questo scambio, mi aspetto che le due righe rimangano in ordine di inserimento (quindi in ordine di ID) avendo fatto un ordinamento per codice di magazzino.

    Se nella query tolgo la clausola ORDER BY le righe non vengono scambiate.

    Non è un problema, ma vorrei capire come ragiona Access, perchè fa queste operazioni ?.

    Grazie

    Ste

    Senza order by i record sono così come li hai inseriti.

    Se ordini la tabella, segue una sorta di ordine per un campo ordinabile

    Nel tuo caso prova ad inserire un id con data inferiore o superiore all'ordine della colonna scadenza. O controlla le altre colonne se sono in ordine crescente esclusi i numerici.

  • Re: Perchè Access scambia i record ?

    28/06/2023 - sihsandrea ha scritto:


    Senza order by i record sono così come li hai inseriti.

    ;))   che dire… stà affogando in mezzo bicchiere d'acqua. In una stringa sql almeno sapere come e perchè impostare un Order By…. mah ;)) 

  • Re: Perchè Access scambia i record ?

    28/06/2023 - sihsandrea ha scritto:


    28/06/2023 - StackPtr ha scritto:


    Aggiungo:

    in questa tabella con più voci 

    quando ho aggiunto la riga con la freccia rossa, in questa query mi è apparsa prima della riga sopra con QtaRichiesta 400pz e stesso CodComp.

    Avendo poi aggiunto la riga con la freccia verde, ecco che la riga con la freccia rossa rimane sotto l'altra rispettando l'ordine di inserimento.

    In pratica questo scambio avviene solo con il contenuto dell'ultima riga se in tabella appare un'altra riga con lo stesso CodComp.

    Come inserisci il record? Che comando usi?

    Sul primo campo (colonna), 12 viene prima di 15…

    Al pari del primo campo, tu decrcomp (secondo campo) come lo ordineresti?

    Come ordineresti nome e cognome a parità di nome?

  • Re: Perchè Access scambia i record ?

    Mi sembra che nessuno qui abbia usato un linguaggio volgare e arrogante tranne l'autore del Thread

    Le spiegazioni sono state date, come risolvere l'eventuale problema di ordinamento sulla base d'inserimento records è stato detto e spiegato.

    Se non si hanno le basi atte a capire le risposte bisogna che studi e tanto pure. Ovviamente solo un consiglio.

    Detto questo mi limito a segnalare e nient'altro di più.



    P.S. qui nessuno è nato imparato. Qui tutti hanno studiato e sarebbe il caso che lo faccia pure tu. Questo Forum non è un corso per principianti ma nonostante questo si forniscono in continuazione nozioni e info utili per accrescere le proprie conoscenze. E questo viene fatto quotidianamente da tutti.

Devi accedere o registrarti per scrivere nel forum
11 risposte