OVH Cloud OVH Cloud

Supprimer des doublons

8 réponses
Avatar
loic
Bonjour,

J'ai une table avec plusieurs champs, dont certains sont en doublons
...Comment procéder pour nettoyer la table des lignes en doublons ??

Merci

Loic

8 réponses

Avatar
Pierre CFI [mvp]
bonjour
fait une req en regroupement, puis tu crée une table avec

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
Site perso
http://access.cfi.free.fr
"loic" a écrit dans le message de news:
Bonjour,

J'ai une table avec plusieurs champs, dont certains sont en doublons
...Comment procéder pour nettoyer la table des lignes en doublons ??

Merci

Loic


Avatar
jean.paulo
Ca parait plus compliqué, mais en fait un petit bout de code est très
simple.
Il suffit de travailler sur une query dont les champs DOUBLONS sont triés
par ordre
alpha, puis :

Function Remove_xref_dup()
'
' Cette fonction supprime les doublons complets dans la table Table_xref (
deux champs livre et refer )
'
Dim bd As Database, frd As Recordset
Dim Old_refer As Double
Dim Old_livre As String
Dim old_numero As Double
Dim old_index As Double
Dim old_autre As Double
Dim old_maitre As Double
Dim numa1, numrec, recount, temp, tempi As Integer
Set bd = CurrentDb()
'
' doublons de la table des Xrefs
'
Set frd = bd.OpenRecordset("Q_xref_tri", dbOpenDynaset)
frd.MoveFirst
frd.MoveLast
' ceci pour ajouter la barre
recount = frd.RecordCount
temp = SysCmd(SYSCMD_INITMETER, "Enlever les doubles Xref film",
recount)
temp = SysCmd(SYSCMD_UPDATEMETER, 0)
frd.MoveFirst
numrec = 1
Old_refer = 0
Old_livre = ""
old_numero = 0
Do Until frd.EOF
numrec = numrec + 1
tempi = numrec / 100
If tempi = Int(tempi) Then
temp = SysCmd(SYSCMD_UPDATEMETER, numrec)
End If
frd.Edit
If frd![Xref_refer] = Old_refer And frd![Xref_livre] = Old_livre And
frd![Xref_numero] = old_numero Then
frd.Delete
Else
Old_refer = frd![Xref_refer]
Old_livre = frd![Xref_livre]
old_numero = frd![Xref_numero]
End If
frd.MoveNext
Loop
frd.Close
temp = SysCmd(5)
MsgBox ("Doublons terminés")
'
End Function

--
Jean.paulo

"Pierre CFI [mvp]" a écrit dans le message de
news:
bonjour
fait une req en regroupement, puis tu crée une table avec

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
Site perso
http://access.cfi.free.fr
"loic" a écrit dans le message de
news:

Bonjour,

J'ai une table avec plusieurs champs, dont certains sont en doublons
...Comment procéder pour nettoyer la table des lignes en doublons ??

Merci

Loic






Avatar
Raymond [mvp]
Bonjour.

J'avais donné cette requête il n'y a pas longtemps sur le forum:

Soit on passe par une nouvelle table en création, soit on passe par une
requête en éliminant doublon par doublon. en général, deux exécutions
suffisent.
si on supprime les doublons sur le champ LeNom par exemple, Numéro étant la
clé primaire,
DELETE Table1.Numéro FROM Table1
WHERE Table1.Numéro In (SELECT Last table1.Numéro AS DernierDeNuméro
FROM table1 GROUP BY table1.LeNom
HAVING Count(table1.LeNom)>1 );

si on veut supprimer le premier on remplace last par First.
il faut supprimer sur un last de la clé primaire pour être sûr des vrais
doublons et non des homonymes.


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"jean.paulo" a écrit dans le message de news:
eIt0%
Ca parait plus compliqué, mais en fait un petit bout de code est très
simple.
Il suffit de travailler sur une query dont les champs DOUBLONS sont triés
par ordre
alpha, puis :

Function Remove_xref_dup()
'
' Cette fonction supprime les doublons complets dans la table Table_xref (
deux champs livre et refer )
'
Dim bd As Database, frd As Recordset
Dim Old_refer As Double
Dim Old_livre As String
Dim old_numero As Double
Dim old_index As Double
Dim old_autre As Double
Dim old_maitre As Double
Dim numa1, numrec, recount, temp, tempi As Integer
Set bd = CurrentDb()
'
' doublons de la table des Xrefs
'
Set frd = bd.OpenRecordset("Q_xref_tri", dbOpenDynaset)
frd.MoveFirst
frd.MoveLast
' ceci pour ajouter la barre
recount = frd.RecordCount
temp = SysCmd(SYSCMD_INITMETER, "Enlever les doubles Xref film",
recount)
temp = SysCmd(SYSCMD_UPDATEMETER, 0)
frd.MoveFirst
numrec = 1
Old_refer = 0
Old_livre = ""
old_numero = 0
Do Until frd.EOF
numrec = numrec + 1
tempi = numrec / 100
If tempi = Int(tempi) Then
temp = SysCmd(SYSCMD_UPDATEMETER, numrec)
End If
frd.Edit
If frd![Xref_refer] = Old_refer And frd![Xref_livre] = Old_livre
And
frd![Xref_numero] = old_numero Then
frd.Delete
Else
Old_refer = frd![Xref_refer]
Old_livre = frd![Xref_livre]
old_numero = frd![Xref_numero]
End If
frd.MoveNext
Loop
frd.Close
temp = SysCmd(5)
MsgBox ("Doublons terminés")
'
End Function

--
Jean.paulo


Avatar
Pierre CFI [mvp]
.../....
un doublon sur un champ, c'est pas un doublon

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
Site perso
http://access.cfi.free.fr
"Raymond [mvp]" a écrit dans le message de news:%
Bonjour.

J'avais donné cette requête il n'y a pas longtemps sur le forum:

Soit on passe par une nouvelle table en création, soit on passe par une
requête en éliminant doublon par doublon. en général, deux exécutions
suffisent.
si on supprime les doublons sur le champ LeNom par exemple, Numéro étant la
clé primaire,
DELETE Table1.Numéro FROM Table1
WHERE Table1.Numéro In (SELECT Last table1.Numéro AS DernierDeNuméro
FROM table1 GROUP BY table1.LeNom
HAVING Count(table1.LeNom)>1 );

si on veut supprimer le premier on remplace last par First.
il faut supprimer sur un last de la clé primaire pour être sûr des vrais
doublons et non des homonymes.


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"jean.paulo" a écrit dans le message de news:
eIt0%
Ca parait plus compliqué, mais en fait un petit bout de code est très
simple.
Il suffit de travailler sur une query dont les champs DOUBLONS sont triés
par ordre
alpha, puis :

Function Remove_xref_dup()
'
' Cette fonction supprime les doublons complets dans la table Table_xref (
deux champs livre et refer )
'
Dim bd As Database, frd As Recordset
Dim Old_refer As Double
Dim Old_livre As String
Dim old_numero As Double
Dim old_index As Double
Dim old_autre As Double
Dim old_maitre As Double
Dim numa1, numrec, recount, temp, tempi As Integer
Set bd = CurrentDb()
'
' doublons de la table des Xrefs
'
Set frd = bd.OpenRecordset("Q_xref_tri", dbOpenDynaset)
frd.MoveFirst
frd.MoveLast
' ceci pour ajouter la barre
recount = frd.RecordCount
temp = SysCmd(SYSCMD_INITMETER, "Enlever les doubles Xref film",
recount)
temp = SysCmd(SYSCMD_UPDATEMETER, 0)
frd.MoveFirst
numrec = 1
Old_refer = 0
Old_livre = ""
old_numero = 0
Do Until frd.EOF
numrec = numrec + 1
tempi = numrec / 100
If tempi = Int(tempi) Then
temp = SysCmd(SYSCMD_UPDATEMETER, numrec)
End If
frd.Edit
If frd![Xref_refer] = Old_refer And frd![Xref_livre] = Old_livre
And
frd![Xref_numero] = old_numero Then
frd.Delete
Else
Old_refer = frd![Xref_refer]
Old_livre = frd![Xref_livre]
old_numero = frd![Xref_numero]
End If
frd.MoveNext
Loop
frd.Close
temp = SysCmd(5)
MsgBox ("Doublons terminés")
'
End Function

--
Jean.paulo






Avatar
Raymond [mvp]
c'est un exemple mon cher, pour dire qu'on peut le faire directement par une
requête. il faut bien sûr aménager les champs en doublons potentiels.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Pierre CFI [mvp]" a écrit dans le message de
news: %
.../....
un doublon sur un champ, c'est pas un doublon

--
Pierre CFI


Avatar
Pierre CFI [mvp]
hum, encore un truc à la 3stone :o))

--
Pierre CFI
MVP Microsoft Access
Mail : http://cerbermail.com/?z0SN8cN53B

Site pour bien commencer
Access http://users.skynet.be/mpfa/
Excel http://www.excelabo.net
Site perso
http://access.cfi.free.fr
"Raymond [mvp]" a écrit dans le message de news:ut5%
c'est un exemple mon cher, pour dire qu'on peut le faire directement par une
requête. il faut bien sûr aménager les champs en doublons potentiels.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Pierre CFI [mvp]" a écrit dans le message de
news: %
.../....
un doublon sur un champ, c'est pas un doublon

--
Pierre CFI






Avatar
jean.paulo
L'exemple de code VB que j'ai donné fonctionne parfaitement bien. Il peut
tester
pour les vrais doublons (Plusieurs champs identiques), et fonctionne
rapidement
en une seule passe.

Ainsi, pour la table en question, qui contient 200 000 enregistrements, dont
10 % de doublons, il ne prend que 5 secondes. (La raison de ces doublons est
que
la table est remplie automatiquement par une autre routine. Il m'a semblé
plus rapide
de mettre tous les enregistrements, puis de supprimer les doublons, plutot
que
de chercher à chaque enregistrement s'il existe déjà. C'est le numéro d'un
réalisateur
qui peut exister à deux endroits dans ma base. Bien sûr, cela demande un peu
de compactage de temps à autre, sinon la base gonfle)

Je suis loin d'être un expert en SQL, mais il me semble qu'une passe,
c'est mieux que deux , non ?
--
Jean.paulo

"Raymond [mvp]" a écrit dans le message de
news:%
Bonjour.

J'avais donné cette requête il n'y a pas longtemps sur le forum:

Soit on passe par une nouvelle table en création, soit on passe par une
requête en éliminant doublon par doublon. en général, deux exécutions
suffisent.
si on supprime les doublons sur le champ LeNom par exemple, Numéro étant
la

clé primaire,
DELETE Table1.Numéro FROM Table1
WHERE Table1.Numéro In (SELECT Last table1.Numéro AS DernierDeNuméro
FROM table1 GROUP BY table1.LeNom
HAVING Count(table1.LeNom)>1 );

si on veut supprimer le premier on remplace last par First.
il faut supprimer sur un last de la clé primaire pour être sûr des vrais
doublons et non des homonymes.


--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"jean.paulo" a écrit dans le message de news:
eIt0%
Ca parait plus compliqué, mais en fait un petit bout de code est très
simple.
Il suffit de travailler sur une query dont les champs DOUBLONS sont
triés


par ordre
alpha, puis :

Function Remove_xref_dup()
'
' Cette fonction supprime les doublons complets dans la table Table_xref
(


deux champs livre et refer )
'
Dim bd As Database, frd As Recordset
Dim Old_refer As Double
Dim Old_livre As String
Dim old_numero As Double
Dim old_index As Double
Dim old_autre As Double
Dim old_maitre As Double
Dim numa1, numrec, recount, temp, tempi As Integer
Set bd = CurrentDb()
'
' doublons de la table des Xrefs
'
Set frd = bd.OpenRecordset("Q_xref_tri", dbOpenDynaset)
frd.MoveFirst
frd.MoveLast
' ceci pour ajouter la barre
recount = frd.RecordCount
temp = SysCmd(SYSCMD_INITMETER, "Enlever les doubles Xref film",
recount)
temp = SysCmd(SYSCMD_UPDATEMETER, 0)
frd.MoveFirst
numrec = 1
Old_refer = 0
Old_livre = ""
old_numero = 0
Do Until frd.EOF
numrec = numrec + 1
tempi = numrec / 100
If tempi = Int(tempi) Then
temp = SysCmd(SYSCMD_UPDATEMETER, numrec)
End If
frd.Edit
If frd![Xref_refer] = Old_refer And frd![Xref_livre] = Old_livre
And
frd![Xref_numero] = old_numero Then
frd.Delete
Else
Old_refer = frd![Xref_refer]
Old_livre = frd![Xref_livre]
old_numero = frd![Xref_numero]
End If
frd.MoveNext
Loop
frd.Close
temp = SysCmd(5)
MsgBox ("Doublons terminés")
'
End Function

--
Jean.paulo






Avatar
Raymond [mvp]
Bonjour.

la question n'est pas de savoir si une passe est mieux que 2, c'est évident.
J'ai simplement donné le modèle de requête de suppression de doublons qui
n'existe pas de base dans access. ce type de requête est très utile pour les
débutants en vba ou même ceux qui ne connaissent pas du tout vba.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"jean.paulo" a écrit dans le message de news:

L'exemple de code VB que j'ai donné fonctionne parfaitement bien. Il peut
tester
pour les vrais doublons (Plusieurs champs identiques), et fonctionne
rapidement
en une seule passe.

Ainsi, pour la table en question, qui contient 200 000 enregistrements,
dont
10 % de doublons, il ne prend que 5 secondes. (La raison de ces doublons
est
que
la table est remplie automatiquement par une autre routine. Il m'a semblé
plus rapide
de mettre tous les enregistrements, puis de supprimer les doublons, plutot
que
de chercher à chaque enregistrement s'il existe déjà. C'est le numéro d'un
réalisateur
qui peut exister à deux endroits dans ma base. Bien sûr, cela demande un
peu
de compactage de temps à autre, sinon la base gonfle)

Je suis loin d'être un expert en SQL, mais il me semble qu'une passe,
c'est mieux que deux , non ?
--
Jean.paulo