Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/07/2004, 16h23   #1
rsc
Membre émérite
 
Avatar de rsc
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 699
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 61
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 : 699
Points : 874
Points : 874
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 :
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 :
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
rsc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2004, 16h42   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: Mettre à jour une table depuis une autre

Je pense que vous avez inversé les messages d'erreurs...
Code :
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 :
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 :
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 :
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.
Barbibulle est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2004, 08h11   #3
rsc
Membre émérite
 
Avatar de rsc
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 699
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 61
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 : 699
Points : 874
Points : 874
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 :
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 :
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
rsc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2004, 10h00   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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.
Barbibulle est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/07/2004, 10h08   #5
rsc
Membre émérite
 
Avatar de rsc
 
Homme
Développeur informatique
Inscription : juin 2004
Messages : 699
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 61
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 : 699
Points : 874
Points : 874
je vais tester les deux.

Roland
rsc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h11.


 
 
 
 
Partenaires

Hébergement Web