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

SQL Oracle Discussion :

Ne pas prendre les doublons de deux tables


Sujet :

SQL Oracle

  1. #1
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut Ne pas prendre les doublons de deux tables
    Bonjour,

    j'ai les tables suivantes :

    T1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ID	DATE_I		DATE_F		T	Q	R
    1	31/10/08	25/11/08	2	20	17
    1	26/11/08	26/11/08	2	17	20
    ...

    T2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ID	DATE_I		DATE_F		T	Q	R
    1	31/10/08	25/11/08	2	20	20
    ...
    je ne voudrais que les lignes de la table T1 qui ne sont pas présentent dans la table T2 pour les même valeurs des champs ID, DATE_I et DATE_F. Donc dans mon exemple n'avoir que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1	26/11/08	26/11/08	2	17	20
    j'ai donc fais la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from T1
    where (ID, DATE_I, DATE_F) not in (select ID, DATE_I, DATE_F from T2)
    et même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select t1.*
    from t1 left outer join t2
    on t1.ID = t2.ID
    and t1.DATE_I = t2.DATE_I
    and t1.DATE_F = t2.DATE_F
    where t2.ID is NULL
    mais avec des tables de plus de 10 millions de lignes je n'arrive a avoir des résultats qu'après 1h...

    j'indiquerai juste qu'il y a des indexes sur les champs ID mais pas sur les champs DATE_I et DATE_F car cela allourdi encore plus le traitement si j'en met sur ces champs.

    Quelqu'un aurait-il une solution ?
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Essaye cette requête.

    Salim.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT ID, date_i, date_f, t, q, r
      FROM t1
     WHERE NOT EXISTS (
              SELECT NULL
                FROM t2
               WHERE t2.ID = t1.ID
                 AND t2.date_i = t1.date_i
                 AND t2.date_f = t1.date_f)

  3. #3
    Membre actif Avatar de kore62
    Profil pro
    Inscrit en
    Août 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 222
    Points : 205
    Points
    205
    Par défaut
    Bonsoir,

    Si tes tests ne sont pas concluant avec la solution du dessus, tu peux tenter l'une de ces deux solutions :

    -- Une autre solution a tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM T1
    WHERE (ID, DATE_I, DATE_F) IN (SELECT ID, DATE_I, DATE_F FROM T1
    			       MINUS
    			       SELECT ID, DATE_I, DATE_F FROM T2)
    -- Une autre solution a tester
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT t.* FROM T1 t, (SELECT ID, DATE_I, DATE_F FROM T1 
                          MINUS 
                          SELECT ID, DATE_I, DATE_F FROM T2) v
    where v.ID = t.ID
    and v.DATE_I = t.DATE_I
    and v.DATE_F = t.DATE_F
    L'habitude est l'illusion d'un acquis imaginaire...

    Mes Compos Ziks Electros:http://fishbone2k.free.fr/technorulez/news.php?id=89

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par jsd03 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from T1
    where (ID, DATE_I, DATE_F) not in (select ID, DATE_I, DATE_F from T2)
    ça me parait être la bonne commande !!!

    entre T1 et T2, quelle est la plus grande table? et quel est le plan d'execution

  5. #5
    Rédacteur
    Avatar de jsd03
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2008
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Août 2008
    Messages : 1 221
    Points : 6 506
    Points
    6 506
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    ça me parait être la bonne commande !!!

    entre T1 et T2, quelle est la plus grande table? et quel est le plan d'execution
    Oui c'est la bonne commande mais avec des tests sur une table réduite ça fonctionne mais avec la table complète la requête met trop de temps à renvoyer les résultats.

    Pour info, la requête de salim11 fonctionne correctement sur la table réduite et la table complète.

    Sujet résolut.

    Merci à tous
    Google est ton ami mais ton voisin aussi

    Modérateur BI - Responsable Talend
    Mes tutoriels - FAQ Talend - FAQ SQL*Plus

    Avant toute chose : lire le mode d'emploi du forum et ses règles.
    Suivez @Developpez sur twitter !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/05/2014, 13h12
  2. Réponses: 0
    Dernier message: 09/02/2011, 09h13
  3. [AC-2003] Eviter les doublons entre deux tables
    Par soleil_levant dans le forum Modélisation
    Réponses: 1
    Dernier message: 23/06/2009, 17h29
  4. Réponses: 2
    Dernier message: 21/04/2009, 21h10
  5. Comment éviter les doublons dans ma table
    Par einegel dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/11/2004, 12h18

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