IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[ORACLE-SQL]virer mes doublons


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 56
    Points
    56
    Par défaut [ORACLE-SQL]virer mes doublons
    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...

  2. #2
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    NUMERO_DE_LIGNE est il propre à chaque enregistrement? Quelle est la clé primaire de ta table?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE
    FROM EXTFIL a
    WHERE  NUMERO_DE_LIGNE IN  (SELECT NUMERO_DE_LIGNE
                   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 ...

    Est-ce ça avec la méthode des IN dont tu dis que ça met trop de temps?


    Jasmine,
    -- Jasmine --

  3. #3
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  4. #4
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    L'ennui avec cette solution, c'est qu'à chaque fois je vais manipulé 8 millions de lignes. Et de plus, les traimtements que je vais faire ensuite avec extfil (avant de l'historisé), contiendra des lignes que j'avais deja traiter auparavant.
    Je préfererai faire quelquechose qui compare Le extfil au extfil_hist mais je n'arrive pas a trouver la requête parfaite.

    Pour jasmine: je n'ai pas vraiment de clé primaire dans la tables, je ne peux pas déterminer l'intégrité d'une ligne avec une clé, c'est ca la difficulté.

    Quand je parle de la méthode des IN je veux parler de qqchose du genre :
    delete from extfil a
    where a.bordereau in (select bordereau from extfil_hist)
    and a.serveur in (select serveur from extfil_hist).
    ...

    Même pas sure que cela marche de surcroit...

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 735
    Points
    52 735
    Billets dans le blog
    5
    Par défaut
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/doublons/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    J'ai bien lu ton article, qui est il faut dire tres bien rédigé et contient un maximum d'info.

    La seule chose qui m'interesse dans mon cas est celui de la table temporaire (ce que j'avais deja testé auparavant), la fonction de ranking ne fonctionnant pas à cause de mon SGBDR.

    Avec la table temporaire, le traitement durait beaucoup trop longtemps.

    J'ai donc récupéré la requête qui supprime les doublons de ton article, et j'ai essayé de l'adapter (voir mon 1er post).

    Je n'ai pas l'impression que cela fonctionne, aurais-je omis quelquechose ?

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par gusrom86
    la fonction de ranking ne fonctionnant pas à cause de mon SGBDR
    J'ai lu votre post en diagonale mais sur Oracle, vous disposez du ROWNUM ou au pire du ROWID pour identifier chaque ligne de votre table de manière unique, non ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  8. #8
    Membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 56
    Points
    56
    Par défaut
    Ce n'est pas faux, je n'avais même pas pensé à remplacer le ranking et utiliser le rowid.

    J'ai intégré le changement, je vais voir ce que cela donne, merci pour ta perspicacité...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/03/2011, 14h17
  2. Réponses: 7
    Dernier message: 25/07/2005, 13h41
  3. conflit oracle sql server ?
    Par skaii dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 10/02/2005, 18h28
  4. [ORACLE][SQL] procedure sous delphi avec une requete SQL
    Par nivet dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/11/2004, 13h43
  5. Connexion SGBD Oracle-SQL langage C/C++
    Par K2004 dans le forum Interfaces de programmation
    Réponses: 4
    Dernier message: 10/02/2004, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo