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 Firebird Discussion :

Mettre à jour une table depuis une autre


Sujet :

SQL Firebird

  1. #1
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut Mettre à jour une table depuis une autre
    Sous Interbase 6, j'essaie de mettre à jour une table depuis une autre, et les méthodes indiquées sur le forum Langage SQL ne marchent pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE TableA
    SET    C2 = (SELECT B.C2
                 FROM   TableA A
                        INNER JOIN TableB B
                              ON A.C1 = B.C1)
    donne une erreur "Token Unknown FROM

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TableA
    SET c2=TableB.C2
    FROM TableB
    WHERE TableB.C1=TableA.C1
    donne "Multiple rows in a singleton select", alors même que C1 est la clé primaire de TableB

    Est-ce que je commets une erreur, on bien ces syntaxes ne sont pas supportées par Interbase 6 ? Et dans ce cas, que me reste-ti-il comme solution ?

    Roland

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Re: Mettre à jour une table depuis une autre
    Je pense que vous avez inversé les messages d'erreurs...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE TableA
    SET    C2 = (SELECT B.C2
                 FROM   TableA A
                        INNER JOIN TableB B
                              ON A.C1 = B.C1)
    donne "Multiple rows in a singleton select"
    car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT B.C2
                 FROM   TableA A
                        INNER JOIN TableB B
                              ON A.C1 = B.C1
    retourne bien une liste de valeur et non UNE valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TableA
    SET c2=TableB.C2
    FROM TableB
    WHERE TableB.C1=TableA.C1
    donne une erreur "Token Unknown FROM
    Car la syntax est tout simplement fausse...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TableA A
    SET    C2 = (SELECT B.C2
                 FROM TableB B
                 where  B.C1 = A.C1)
    Serait plus juste.
    Celà va mettre à jour la colonne C2 de la tableA avec la valeur trouvé dans la table TableB si elle existe sinon affecte null. Et ce pour toutes les données C2 de la table tableA.

  3. #3
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut Re: Mettre à jour une table depuis une autre
    Citation Envoyé par Barbibulle
    Je pense que vous avez inversé les messages d'erreurs...
    exact

    Citation Envoyé par Barbibulle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE TableA A
    SET    C2 = (SELECT B.C2
                 FROM TableB B
                 where  B.C1 = A.C1)
    Serait plus juste.
    Exact encore, ça marche

    J'élargis ma question : pour mettre à jour plusieurs champs, on m'a proposé une syntaxe qui, corrigée suivant votre modèle, donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE TableA A
    SET    C2 = (SELECT B.C2
                 FROM TableB B
                 where  B.C1 = A.C1),
             C3 = (SELECT B.C3
                 FROM TableB B
                 where  B.C1 = A.C1)
    Ca marche, je viens de le vérifier, mais j'ai l'impression qu'on fait 2 requêtes qu'on pourrait regrouper. Autrement dit, y a-t-il moyen d'optimiser ou non ?

    Encore un grand merci pour votre aide

    Roland

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Oui votre requete est bonne, et il n'y a pas syntaxiquement moyen de regroupper les deux sous-select.

    Mais celà n'est pas très grave d'un point de vue performance, le premier sous select fait monter en mémoire l'enregistrement et l'index primaire. Le second sous select bénéficiera de cette monté en mémoire et sera donc plus performant que le premier.
    Donc normalement l'impacte sur les perfs doivent être assez légère.

    Cependant si vous voulez quelque chose de plus performant vous pouvez créer une procédure stockée qui fera un seul select sur la table TableB pour rammener toutes les colonnes qui ont besoin d'être recopiées dans la table TableA. puis il suffit de faire l'update de la table TableA avec les données mémorisées par le premier select.

  5. #5
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    je vais tester les deux.

    Roland

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

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. [AC-2007] Copier une table depuis une base vers une autre
    Par Triton972 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/11/2009, 19h27
  3. Réponses: 4
    Dernier message: 03/07/2008, 15h53
  4. Comment mettre à jour 1 champ d'une table via une autre tabl
    Par cpasmoibiensur dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/02/2006, 13h33

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