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

DB2 Discussion :

[SQL]UPDATE avec JOIN


Sujet :

DB2

  1. #1
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 97
    Points : 49
    Points
    49
    Par défaut [SQL]UPDATE avec JOIN
    Bonjour,

    Je souhaite faire un update en intégrant un "inner join" (la table en inner join sur elle-même) de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Update table as X inner join table as Y on X.id=Y.id 
    set X.phone=Y.phone where ...
    Appremment la syntaxe ne fonctionne pas. En cherchant sur Internet, j'ai vu que le problème se posait souvent et que beaucoup de personnes s'en sortaient en faisant un SELECT imbriqué. D'un point de vue performance c'est impossible à envisager sur ma table (340'000 lignes doivent être mises à jour).

    Avez-vous une solution ?

    Je vous remercie d'avance pour toute réponse.

    Sempire

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Pas de JOIN dans un UPDATE supporté à ce jour.
    Effectivement c'est une question récurente.

    Faut faire plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE FICHIER1 A 
       SET A.CHAMP1 = 'X'
     WHERE ...
       AND EXISTS(SELECT 1
                    FROM FICHIER2 B
                   WHERE A.CLE1 = B.CLE1)

  3. #3
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Citation Envoyé par sempire Voir le message
    ...
    Je souhaite faire un update en intégrant un "inner join" (la table en inner join sur elle-même) de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Update table as X inner join table as Y on X.id=Y.id 
    set X.phone=Y.phone where ...
    Mais quel est l'interêt de l'opération ?

  4. #4
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Je confirme les propos de K2R400, il faut une sous-requête. De plus, tu souhaites mettre à jour une colonne d'une table avec une colonne d'une autre table. C'est donc une double ss-requête que tu dois exécuter du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE TAB1 AS X 
    SET X.phone= (
       SELECT Y.phone FROM TAB2 AS Y
       WHERE X.id = Y.id
       AND prédicats supplémentaires si nécessaire)
    WHERE EXISTS (
       SELECT 0 FROM TAB2 AS Y
       WHERE X.id = Y.id
       AND prédicats supplémentaires si nécessaire)
    En effet, si tu te contentes de la ss-requête de la clause SET, si la ligne de TAB1 n'existe pas dans TAB2, DB2 va quand même vouloir mettre à jour la ligne puisqu'il n'y a pas de clause WHERE ; et puisqu'il ne trouve pas dans TAB2, DB2 va vouloir mettre la valeur NULL. Soit ta colonne accepte NULL, l'UPDATE fonctionne, mais ne répond certainement pas à ton souhait. Soit la colonne n'accepte pas le NULL et dans ce cas erreur -407 si je ne m'abuse.

    Quant aux temps de réponse, en effet, une double ss-requête, ça calme. Mais si tes tables ne font que quelques centaines de milliers de lignes et et que tes prédicats de corrélations renvoient une ligne unique, c'est jouable en quelques minutes. Mais gaffe aux contentions puisque pas de commit intermédiaire possible. Tu risque d'avoir un LOCK ESCALATION si LOCKSIZE ANY ou un -904 si LOCKSIZE PAGE et que tu atteints le nombre maxi de LOCK possibles pour une tache.

    Bonne utilisation et bonne journée.

Discussions similaires

  1. Pb requete sql update avec jdbc
    Par nickyla dans le forum JDBC
    Réponses: 3
    Dernier message: 09/09/2008, 13h39
  2. UPDATE avec JOIN ?
    Par zakuli dans le forum Débuter
    Réponses: 3
    Dernier message: 25/07/2007, 14h53
  3. Réponses: 4
    Dernier message: 26/09/2006, 18h28
  4. [SQL] update avec decode
    Par jojo22222 dans le forum Oracle
    Réponses: 8
    Dernier message: 04/01/2006, 17h50
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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