Access: ricerca duplicati su due campi

Anonimo
2015-01-18T18:43:09+00:00

Ciao a tutti,

chiedo cortesemente un chiarimento sul funzionamento della Query "ricerca duplicati" generata da Access su due campi (nel mio esempio, una tabella  - non normalizzata - composta da "Comune - CAP - Provincia - Regione"). Scegliendo CAP e Provincia, l'SQL generato è il seguente:

SELECT First(Località.CAP) AS CAPCampo, First(Località.PROVINCIA) AS PROVINCIACampo, Count(Località.CAP) AS NumDuplicati

FROM Località

GROUP BY Località.CAP, Località.PROVINCIA

HAVING (((Count(Località.CAP))>1) AND ((Count(Località.PROVINCIA))>1));

Quello che non capisco è il significato (il funzionamento) di "First" (SELECT FIRST ....); ho provato a toglierlo ed il risultato è il medesimo.

Mi direte di studiarmi meglio l'SQL ... ringrazio se mi date qualche dritta!

Grazie e buona serata

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

5 risposte

Ordina per: Più utili
  1. Anonimo
    2015-01-18T21:44:27+00:00

    Ciao Ivo,

    se dal tuo db di esempio lancio la creazione "query ricerca duplicati" con i campi CAP e COMUNE (quelli usati nella query d'esempio) mi rende questo sql:

    SELECT First(Località.[CAP]) AS CAPCampo, First(Località.[COMUNE]) AS COMUNECampo, Count(Località.[CAP]) AS NumDuplicati

    FROM Località

    GROUP BY Località.[CAP], Località.[COMUNE]

    HAVING (((Count(Località.[CAP]))>1) AND ((Count(Località.[COMUNE]))>1));

    è conforme a quello che hai mostrato nel primo post, no capisco l'uso di First ma almeno non ha la DISTINCT e l'operatore IN

    Ho usato Access 2010 che dovrebbe essere anche quello usato da te.

    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-01-18T21:11:34+00:00

    Ciao, Giorgio,

    quel che mi lascia perplesso è purtroppo che quel codice è generato da Access 2010.

    La tabella è semplicissima: una tabella "Località" (non normalizzata, ma è un altro discorso) su cui ho generato una "Query ricerca duplicati". Vedendo l'SQL ... ho avuto qualche perplessità.

    Vedi qui

    Grazie ancora e buona serata

    Ivo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-01-18T20:45:44+00:00

    Ciao Ivo,

    certamente, nella prima query l'opzione DISTINCT non serve a niente perchè CAP è l'unico campo ed è incluso nella GROUP BY quindi viene reso già con valori distinti, poi l'operatore IN serve solo a complicare le cose e a rendere la query più pesante.

    non so dove hai preso il codice della prima query ma fortunatamente non è stato generato da Access

    :-)

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-01-18T20:33:10+00:00

    anche per me è oscuro il motivo di usare la funzione di aggregazione First (o qualsiasi altra Min Max Last ecc ) su campi inseriti nella clausola GROUP BY

    Ciao, Giorgio,

    domanda simile si può fare anche per una "ricerca duplicati semplice", costruita così:

    SELECT DISTINCT Località.CAP, Count(Località.CAP) AS ConteggioDiCAP

    FROM Località

    GROUP BY Località.CAP

    HAVING (((Località.CAP) In (SELECT [CAP] FROM [Località] As Tmp GROUP BY [CAP] HAVING Count(*)>1 )))

    ORDER BY Località.CAP;

    e che io costruirei in modo molto più semplice (con i medesimi risultati, a meno di un errore mio !):

    SELECT DISTINCT Località.CAP, Count(Località.CAP) AS ConteggioDiCAP

    FROM Località

    GROUP BY Località.CAP

    HAVING (((Count(Località.CAP))>1))

    ORDER BY Località.CAP;

    Grazie e buona serata

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2015-01-18T20:19:07+00:00

    Ciao Ivo,

    bella domanda !!

    :-)

    anche per me è oscuro il motivo di usare la funzione di aggregazione First (o qualsiasi altra Min Max Last ecc ) su campi inseriti nella clausola GROUP BY

    se Cap e Provincia sono inserite nella Group By avrò un set di righe con valori distinti di Cap e Provincia quindi L'utilizzo di Last mi sembra inutile.

    io l'avrei scritta così:

    SELECT CAP, PROVINCIA, Count(*) AS NumDuplicati

    FROM Località

    GROUP BY CAP, PROVINCIA

    HAVING Count(*) > 1

    L'utilizzo del Count(*) permette di individuare anche le righe con CAP e PROVINCIA valorizzate a NULL

    comunque vediamo se ad altri viene in mente qualcosa, io al momento non vedo l'utilità di usare First

    Ciao

    Giorgio Rancati

    La risposta è stata utile?

    0 commenti Nessun commento