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 :

UPDATE avec 2 tables jointes (jointure basée sur plusieurs champs)


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 22
    Points : 19
    Points
    19
    Par défaut UPDATE avec 2 tables jointes (jointure basée sur plusieurs champs)
    Salut,

    Je suis plus qu'un débutant sur ORACLE mais je suis sur un projet où je suis obligé de m'en servir et là, je bloque sur une requête qui devrait pourtant être facile.

    Je voudrais mettre à jour les enregistrements "LAB_JOB_NO" d'une table "ST_RESULT" (2000000 enregistrements) en fonction de leur présence dans une autre table de contrôle "ToFix" (7300 enregistrements).

    J'arrive parfaitement à joindre mes deux tables avec cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT sr.*  
    FROM ST_RESULT sr, ToFix tf 
    WHERE sr.ELEMENT = tf.ELEMENT 
       AND sr.METHOD = tf.METHOD 
       AND sr.SAMPLE_TAG = tf.SAMPLE_TAG 
       AND sr.DESPATCH_ID = tf.DESPATCH_ID;
    Mais après, pour faire l'update basé sur ce lien, j'ai essayé tout ce que j'ai pu et je n'ai pas encore trouvé la bonne formule avec par exemple (excuser de l'horrible code que je vais coller, c'est juste pour donner une idée)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE ST_RESULT
    SET LAB_JOB_NO = 'PILBARA'
    WHERE ELEMENT, METHOD, SAMPLE_TAG, DESPATCH_ID IN (
        SELECT sr.*  
        FROM ST_RESULT sr, ToFix tf 
        WHERE sr.ELEMENT = tf.ELEMENT 
            AND sr.METHOD = tf.METHOD 
            AND sr.SAMPLE_TAG = tf.SAMPLE_TAG 
            AND sr.DESPATCH_ID = tf.DESPATCH_ID);
    Je suis bloqué là, Google n'est plus mon ami ...

    Merci.

    Alex.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par xla99 Voir le message
    Je voudrais mettre à jour les enregistrements "LAB_JOB_NO" d'une table "ST_RESULT" (2000000 enregistrements) en fonction de leur présence dans une autre table de contrôle "ToFix" (7300 enregistrements).
    Il y a EXISTS pour ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE ST_RESULT sr
    SET LAB_JOB_NO = 'PILBARA'
    WHERE exists (
        SELECT 1
        FROM ToFix tf
        WHERE sr.ELEMENT = tf.ELEMENT
            AND sr.METHOD = tf.METHOD
            AND sr.SAMPLE_TAG = tf.SAMPLE_TAG
            AND sr.DESPATCH_ID = tf.DESPATCH_ID);
    D'un autre côté 2000000 vs 7300 il est possible que IN soit plus performant, dans ce cas il faut utiliser des ():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE ST_RESULT
    SET LAB_JOB_NO = 'PILBARA'
    WHERE (ELEMENT, METHOD, SAMPLE_TAG, DESPATCH_ID) IN (SELECT ELEMENT, METHOD, SAMPLE_TAG, DESPATCH_ID FROM ToFix);

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Citation Envoyé par xla99 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE ST_RESULT
    SET LAB_JOB_NO = 'PILBARA'
    WHERE ELEMENT, METHOD, SAMPLE_TAG, DESPATCH_ID IN (
        SELECT sr.*  
        FROM ST_RESULT sr, ToFix tf 
        WHERE sr.ELEMENT = tf.ELEMENT 
            AND sr.METHOD = tf.METHOD 
            AND sr.SAMPLE_TAG = tf.SAMPLE_TAG 
            AND sr.DESPATCH_ID = tf.DESPATCH_ID);
    Comme écrit ci-dessus, vous n'avez pas besoin de répéter la table ST_RESULT.

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 22
    Points : 19
    Points
    19
    Par défaut
    La requête utilisant IN marche comme un charme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE ST_RESULT
    SET LAB_JOB_NO = 'PILBARA'
    WHERE (ELEMENT, METHOD, SAMPLE_TAG, DESPATCH_ID) IN (SELECT ELEMENT, METHOD, SAMPLE_TAG, DESPATCH_ID FROM ToFix);
    Merci skuatamad, c'est une épine de moins dans mon pied.

    Alex.

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

Discussions similaires

  1. Jointure externe sur plusieurs champs
    Par thanith dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/02/2013, 21h25
  2. [AC-97] Liste déroulante basée sur plusieurs champs d'une table
    Par docjo dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 02/01/2012, 18h01
  3. Jointure externe sur plusieurs champs
    Par Vict0 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 06/06/2011, 14h58
  4. SQL : Jointure droite sur plusieurs champs
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/12/2006, 14h55

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