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 :

MERGE WHEN NOT MATCHED en une seule instruction ? [11g]


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut MERGE WHEN NOT MATCHED en une seule instruction ?
    Bonjour,

    Je souhaite insérer dans une tableA vide [colonne_A1, colonne_A2, colonne_A3] les valeurs d'une tableB [colonne_B1, colonne_B2, colonne_B3] uniquement sur une inégalité des 2 premières colonnes de chaque table

    J'arrive au résultat sans souci :

    - soit avec un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    merge into tableA a
    using(
     select colonne_B1, colonne_B2, colonne_B3
     from tableB
    ) sr (on sr.colonne_B1 = a.colonne_A1 and sr.colonne_B2 = a.colonne_B2)
    when not matched then
    insert (a.colonne_A1, a.colonne_A2, a.colonne_A3)
    values(sr.colonne_B1, sr.colonne_B2, sr.colonne_B3)
    - soit avec un index unique sur colonne_A1, colonne_A2 et une redirection des doublons de clé vers LOG_ERROR

    - soit avec un index unique et un hint ignore_row_on_dupkey_index

    La question que je me pose est : y a-t'il un moyen de passer en une seule expression cet insert s'il n'y a aucune clé sur les tables ?

    Merci si vous avez une idée :-)

  2. #2
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    L'hypothèse de départ étant que la table a est vide, alors, pour insérer, le mieux reste la commande insert.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into tablea (colonne_A1, colonne_A2, colonne_A3) 
    select distinct colonne_B1, colonne_B2, colonne_B3 
    from tableb

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci de la réponse, le DISTINCT est bien sûr logique dans mon exemple qui est simplifié. Dans ma table réelle, l'équivalence est faire sur 3 champs mais les tables contiennent plus de colonnes, l'utilisation du DISTINCT est donc impossible.

    Par ailleurs j'ai constaté que le MERGE WHEN NOT MATCHED est beaucoup plus rapide que le DISTINCT (à confirmer ?).

  4. #4
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Tu peux t'en sortir oui, mais j'ai du mal à voir l'interet. Le MERGE semble faire l'affaire non ?


    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
    INSERT INTO tablea(colonne_A1, colonne_A2, colonne_A3)
    SELECT colonne_B1, colonne_B2, colonne_B3
      FROM tableb 
    WHERE NOT EXISTS 
      ( 
          SELECT 1
            FROM
               (
                   SELECT colonne_B1 c1, colonne_B2 c2
                     FROM tableb
                    UNION
                   SELECT colonne_A1, colonne_A2
                     FROM tablea
               )
          WHERE tableb.colonne_B1 = c1 
           AND tableb.colonne_B2 = c2
      )
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Oui tout à fait, le MERGE fait très bien le travail, c'est juste par curiosité pour voir si d'autres utilisent d'autres solutions

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

Discussions similaires

  1. [AC-2010] Copier juste la structure d'une table en vba en une seule instruction
    Par AlexFred dans le forum VBA Access
    Réponses: 1
    Dernier message: 26/06/2014, 12h38
  2. remplir tableau avec une seule instruction !
    Par tlemcenvisit dans le forum C++
    Réponses: 3
    Dernier message: 21/06/2014, 18h22
  3. Mettre à jour et lire en une seule instruction
    Par jpguiche dans le forum Requêtes
    Réponses: 5
    Dernier message: 11/12/2013, 13h05
  4. [MySQL] Résultat requête dans un tableau en une seule instruction
    Par senacle dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/02/2010, 12h56
  5. MERGE sans clause WHEN NOT MATCHED
    Par Patmane dans le forum Oracle
    Réponses: 7
    Dernier message: 29/04/2009, 17h02

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