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

Développement SQL Server Discussion :

[SQL SERVER 2000] UPDATE avec jointure


Sujet :

Développement SQL Server

  1. #1
    Jsh
    Jsh est déconnecté
    Membre régulier Avatar de Jsh
    Inscrit en
    Août 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Août 2005
    Messages : 100
    Points : 90
    Points
    90
    Par défaut [SQL SERVER 2000] UPDATE avec jointure
    Bonjour à tous,

    J'avais à ce jour une requête de mise à jour qui s'effectuait ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE TABLE_A
    SET champ1 = (a.champ2 + 'XX')
    FROM TABLE_A a
    WHERE champ3 = a.champ3
    AND champ4 = a.champ4
    Je dois la modifier en faisant une jointure sur une autre table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE TABLE_A
    SET champ1 = (a.champ2 + 'XX')
    FROM TABLE_A a
    INNER JOIN TABLE_B b
    ON a.champ3 = b.champ3
    WHERE champ3 = a.champ3 
    AND champ4 = a.champ4
    Ce code ne marche pas : il considère qu'il y a ambiguïté sur le terme champ3 dans la clause WHERE (et il n'a pas tort !).
    Bien sur, je ne peux pas mettre un alias sur ma table ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE TABLE_A a1
    SET champ1 = (a2.champ2 + 'XX')
    FROM TABLE_A a2
    INNER JOIN TABLE_B b
    ON a1.champ3 = b.champ3
    WHERE a2.champ3 = a1.champ3
    AND a2.champ4 = a1.champ4
    (ça, il aime pas du tout du tout)

    J'ai donc inclus ma jointure dans ma clause WHERE ainsi :

    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
    18
    19
    20
     
    UPDATE TABLE_A
    SET champ1 = (a.champ2 + 'XX')
    FROM TABLE_A a
    WHERE champ3 = a.champ3 
    AND champ3 IN
    (
    SELECT b.champ3 FROM TABLE_B b 
    INNER JOIN TABLE_A a
    ON a.champ3 = b.champ3
    AND a.champ4 = b.champ4
    )
    AND champ4 = a.champ4  
    AND champ4 IN
    (
    SELECT b.champ4 FROM TABLE_B b 
    INNER JOIN TABLE_A a
    ON a.champ3 = b.champ3
    AND a.champ4 = b.champ4
    )
    Mais bon personnellement, je trouve ça plus lourd...

    Quelqu'un aurait une idée ?

    D'avance merci.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous ne pouvez pas aliaser la table que vous souhaitez mettre à jour.
    L'instruction suivante, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE dbo.maTable T
    SET maColonne = 10
    génère l'erreur suivante :

    Msg*102, Niveau*15, État*1, Ligne*1
    Syntaxe incorrecte vers 'T'.
    Et c'est logique : les alias ne sont valables pour les tables seulement dans les spécifications de jointure.
    C'est en fait la spécification de votre jointure qui est incomplète.
    Vous pouvez donc écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE TABLE_A
    SET champ1 = (a.champ2 + 'XX')
    FROM TABLE_A a
    INNER JOIN TABLE_B b
    ON a.champ3 = b.champ3
    AND a.champ4 = b.champ4
    Les contraintes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE champ3 = a.champ3
    AND champ4 = a.champ4
    sont valides mais inutiles : vous vérifiez que la colonne est égale à elle même.

    Habituez-vous à ne spécifier les jointures qu'arpès des JOIN, pas par des WHERE ... AND

    @++

  3. #3
    Jsh
    Jsh est déconnecté
    Membre régulier Avatar de Jsh
    Inscrit en
    Août 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Août 2005
    Messages : 100
    Points : 90
    Points
    90
    Par défaut


    Merci pour cette réponse : vous confirmez ce que je pensais !

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

Discussions similaires

  1. [SQL Server 2000]Update avec case
    Par nox75 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/10/2007, 20h18
  2. [SQL Server 2000]Probleme avec les dates !
    Par ChristopheOce dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/10/2006, 15h58
  3. sql server 2000 installation avec amd 64
    Par rouchederoche dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/10/2006, 09h39
  4. [SQL server 2000] Problème de jointure avec 'Case'
    Par Tankian dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2006, 17h42
  5. Réponses: 16
    Dernier message: 14/04/2006, 18h38

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