Bonjour,
Cela plusieurs jours (semaines ?) que je tente de virer mes doublons sur un table d'à peu près 6 millions de lignes...
J'ai cherché et trouver plusieurs solutions qui jusqu'ici n'ont pas fonctionné...
Alors tout d'abord :
BDD : ORACLE 8.

Voila je m'explique :
Tous les jours j'ai des données qui s'intègrent à partir d'un serveur sur une de mes tables appelé extfil.
Il y a environ 100000 lignes/jour.

J'ai une autre table appelé extfil_hist qui historise pendant 2 mois les données d'extfil après les traitements effectués dessus.

Le problème est, que souvent, j'ai les mêmes données envoyés sur extfil d'un jour à l'autre : des doublons parfaits.
J'ai tenté de faire une table temporaire qui faisait un group by du extfil_hist chaque jour après les traitements d'extfil mais je n'y arrive pas.

Le meilleur moyen je pense (et le plus rapide) serait de comparer a chaque integration dans extfil, les données qui sont deja dans extfil_hist et de les virer.

j'ai la requête suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
DELETE
FROM EXTFIL a
WHERE  EXISTS (SELECT *
               FROM   EXTFIL_HIST b
               WHERE  a.SERVEUR = b.SERVEUR AND a.EMETTEUR = b.EMETTEUR AND a.BORDEREAU = b.bordereau AND 
						a.NUMERO_DE_LIGNE = b.NUMERO_DE_LIGNE AND a.PHASE_REBUT = b.PHASE_REBUT AND 
						a.DATE_REBUT = b.DATE_REBUT AND a.HEURE_REBUT = b.HEURE_REBUT AND 
						a.CODE_DEFAUT = b.CODE_DEFAUT AND a.OEIL = b.OEIL AND a.DATE_COMMANDE = b.DATE_COMMANDE AND 
						a.HEURE_COMMANDE = b.HEURE_COMMANDE AND a.DATE_BON_A_FACTURER = b.DATE_BON_A_FACTURER AND 
						a.HEURE_BON_A_FACTURER = b.HEURE_BON_A_FACTURER AND a.DATE_ANNULATION = b.DATE_ANNULATION AND 
						a.HEURE_ANNULATION = b.HEURE_ANNULATION AND a.TYPE_ARTICLE = b.TYPE_ARTICLE AND 
						a.TYPE_FABRICATION2 = b.TYPE_FABRICATION2 AND a.STOCK_1_FAB_0 = b.STOCK_1_FAB_0 AND 
						a.MARQUE = b.MARQUE AND a.TEINTE = b.TEINTE AND 
						a.DIAMETRE = b.DIAMETRE AND a.SPHERE = b.SPHERE AND a.CYLINDRE = b.CYLINDRE AND 
						a.PS1 = b.PS1 AND a.PS2 = b.PS2 AND a.PS3 = b.PS3 AND a.PS4 = b.PS4 AND 
						a.PS5 = b.PS5 AND a.CODE_CLIENT = b.CODE_CLIENT AND a.CORRESPONDANTE = b.CORRESPONDANTE AND 
						a.SERVEUR_FORCE_PDC = b.SERVEUR_FORCE_PDC AND a.DELAI_COMMANDE = b.DELAI_COMMANDE AND 
						a.DELAI_CHARTE = b.DELAI_CHARTE AND a.QUANTITE = b.QUANTITE AND 
						a.STOCK_EN_ETAT = b.STOCK_EN_ETAT AND a.MANQUANT = b.MANQUANT AND a.MATIERE = b.MATIERE AND 
						a.TYPE_MATIERE = b.TYPE_MATIERE AND a.GENRE = b.GENRE AND a.TYPE_COLO = b.TYPE_COLO AND 
						a.TYPE_CSV = b.TYPE_CSV AND a.TYPE_TSV = b.TYPE_TSV AND a.PHASE_00 = b.PHASE_00 AND 
						a.DATE_00 = b.DATE_00 AND a.HEURE_00 = b.HEURE_00 AND 
						a.PHASE_SURF = b.PHASE_SURF AND a.DATE_SURF = b.DATE_SURF AND a.HEURE_SURF = b.HEURE_SURF AND 
						a.COMPTEUR_SURF = b.COMPTEUR_SURF AND a.PHASE_COLO = b.PHASE_COLO AND 
						a.DATE_COLO = b.DATE_COLO AND a.HEURE_COLO = b.HEURE_COLO AND a.COMPTEUR_COLO = b.COMPTEUR_COLO AND 
						a.PHASE_SUPRA = b.PHASE_SUPRA AND a.DATE_SUPRA = b.DATE_SUPRA AND a.HEURE_SUPRA = b.HEURE_SUPRA AND 
						a.COMPTEUR_SUPRA = b.COMPTEUR_SUPRA AND a.PHASE_CSV = b.PHASE_CSV AND a.DATE_CSV = b.DATE_CSV AND 
						a.HEURE_CSV = b.HEURE_CSV AND a.COMPTEUR_CSV = b.COMPTEUR_CSV AND 
						a.PHASE_TSV = b.PHASE_TSV AND a.DATE_TSV = b.DATE_TSV AND a.HEURE_TSV = b.HEURE_TSV AND 
						a.COMPTEUR_TSV = b.COMPTEUR_TSV AND a.PHASE_TOPCOAT = b.PHASE_TOPCOAT AND a.DATE_TOPCOAT = b.DATE_TOPCOAT AND 
						a.HEURE_TOPCOAT = b.HEURE_TOPCOAT AND a.COMPTEUR_TOP_COAT = b.COMPTEUR_TOP_COAT AND 
						a.PHASE_70 = b.PHASE_70 AND a.DATE_70 = b.DATE_70 AND a.HEURE_70 = b.HEURE_70 AND 
						a.COMPTEUR_70 = b.COMPTEUR_70 AND a.PHASE_80 = b.PHASE_80 AND a.DATE_80 = b.DATE_80 AND 
						a.HEURE_80 = b.HEURE_80 AND a.COMPTEUR_80 = b.COMPTEUR_80 AND a.PHASE_FIN = b.PHASE_FIN AND 
						a.DATE_FIN = b.DATE_FIN AND a.HEURE_FIN = b.HEURE_FIN AND a.COMPTEUR = b.COMPTEUR
						group by SERVEUR, EMETTEUR, BORDEREAU, NUMERO_DE_LIGNE, PHASE_REBUT, DATE_REBUT, HEURE_REBUT, CODE_DEFAUT, OEIL, 
						DATE_COMMANDE, HEURE_COMMANDE, DATE_BON_A_FACTURER, HEURE_BON_A_FACTURER, DATE_ANNULATION, 
						HEURE_ANNULATION, TYPE_ARTICLE, TYPE_FABRICATION2, STOCK_1_FAB_0, MARQUE, TEINTE, DIAMETRE, 
						SPHERE, CYLINDRE, PS1, PS2, PS3, PS4, PS5, CODE_CLIENT, CORRESPONDANTE, SERVEUR_FORCE_PDC, 
						DELAI_COMMANDE, DELAI_CHARTE, QUANTITE, STOCK_EN_ETAT, MANQUANT, MATIERE, TYPE_MATIERE, GENRE, 
						TYPE_COLO, TYPE_CSV, TYPE_TSV, PHASE_00, DATE_00, HEURE_00, PHASE_SURF, DATE_SURF, HEURE_SURF, 
						COMPTEUR_SURF, PHASE_COLO, DATE_COLO, HEURE_COLO, COMPTEUR_COLO, PHASE_SUPRA, DATE_SUPRA, 
						HEURE_SUPRA, COMPTEUR_SUPRA, PHASE_CSV, DATE_CSV, HEURE_CSV, COMPTEUR_CSV, PHASE_TSV, DATE_TSV, 
						HEURE_TSV, COMPTEUR_TSV, PHASE_TOPCOAT, DATE_TOPCOAT, HEURE_TOPCOAT, COMPTEUR_TOP_COAT, PHASE_70, 
						DATE_70, HEURE_70, COMPTEUR_70, PHASE_80, DATE_80, HEURE_80, COMPTEUR_80, PHASE_FIN, DATE_FIN, HEURE_FIN, COMPTEUR
						having count(*) > 1);
 
commit;
Je pense que le 'exists' ne fonctionne pas dans mon cas.
Comme vous pouvez le constater, j'ai énormément de champs et il faut tester tous les champs pour vérifier que ce ne sont pas des doublons parfaits...
Le mieux serait de faire des IN, mais au niveau du temps de traitements je ne suis pas sûr que cela soit parfait.

Voila, je suis preneur de toute suggestion...