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

Langage SQL Discussion :

[SQL Server] mise à jour


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut [SQL Server] mise à jour
    Bonjour,
    je souhaite efectuer une mise à jour d'un champ dans une table sur elle même.
    J'explique
    Table A(id, id_rh, id_superieur) id_superieur est l'identifant du supérieur id en int
    Table B(id_rh, id_rh_superieur) id sur l'id_rh char(6)


    J'ai renormalise un peu la base de données pour données l'équivalent de la table A

    Lors de la migration de l'ancienne bdd sur la nouvelle structure, je ne peux pas insérer le id_rh_superieur car l'utilisateur supérieur n'est pas forcément encore crée. J'insère donc les données de table B puis souhaite effectuer la mise à jour du champ du supérieur.

    Sous ORACLe, j'aurais effectuer la requête suivante

    update TableA a set a.id_superieur=
    (select a2.id from tableA a2, tableB b
    where a.id_rh=b.id_rh and b.id_rh_superieur=a2.id_rh)

    Cette requête ne passe sous SQL server.
    Auriez-vous une idée pour la formaliser ccorrectement?
    Merci d'avance
    cordialement
    Pinocchio

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 042
    Billets dans le blog
    6
    Par défaut
    Il est parfaitement normal que cela ne fonctionne pas car Oracle utilise une technique que la norme SQL interdit : l'utilisation d'un alias dans la table cible.

    Comme il ne peut y avoir qu'une seule table cible dans un ordre de mise à jour (INSERT, UPDATE ou DELETE) il n'y a aucune ambiguité pour savoir quelle est la table cible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE TableA
    SET id_superieur = (SELECT A.id 
                        FROM   tableA A
                               INNER JOIN tableb B
                                     ON B.id_rh_superieur=A.id_rh
                        WHERE  A.id_rh = TableAb.id_rh)
    Sinon, utilisez la technique du FROM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE TableA
    SET id_superieur = SELECT A.id 
    FROM   tableA A1
              INNER JOIN tableA A2
                ON A2.id_rh = A1.id_rh 
            INNER JOIN tableb B
               ON B.id_rh_superieur=A2.id_rh
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    Merci beaucoup,
    Je savais que le problème venait de la norme SQL non respecté par ma syntaxe possible sur ORACLE mais je ne trouvais pas la solution.
    cordialement
    Pinocchio

  4. #4
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    Citation Envoyé par pinocchio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update TableA a set a.id_superieur=
    (select a2.id from tableA a2, tableB b 
    where a.id_rh=b.id_rh and b.id_rh_superieur=a2.id_rh)
    Dans cette requête on voit bien le lien entre la table d'origine et la sous-requete
    Sans ce lien, la requête m'indique
    Serveur : Msg 512, Niveau 16, État 1, Ligne 1
    La sous-requête a retourné plusieurs valeur
    Pourriez-vous, svp, m'indiquer mon erreur. J'ai essayé avec les deux requetes mais le résultat est le même
    Cordialement
    Pinocchio

  5. #5
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Par défaut
    Finalement, je suis passé par les curseurs.
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    -- déclaration des variables de colonnes pour le curseur
    DECLARE @idrh char(6), @idrh_sup int
     
    -- declaration du curseur
    DECLARE MyCursor CURSOR 
    FOR 
       SELECT u.id_rh, au.utilisateur_id
       FROM be_utilisateur u
    	inner join audit_utilisateur au on 
                u.id_superieur_hierarchique=au.id_rh
     
     
    -- ouverture du curseur
    OPEN MyCursor
     
    -- lecture du premier enregistrement
    FETCH MyCursor INTO @idrh, @idrh_sup
     
    -- boucle de traitement
    WHILE @@fetch_Status = 0
    BEGIN
    	update audit_utilisateur 
    	set id_superieur_hierarchique=@idrh_sup
    	where id_rh=@idrh
     
    -- lecture de l'enregistrement suivant
       FETCH MyCursor INTO @idrh, @idrh_sup
    END
     
    -- fermeture du curseur
    CLOSE myCursor
     
    -- libération de la mémoire
    DEALLOCATE myCursor
    Merci encore
    Cordialement
    Pinocchio

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

Discussions similaires

  1. Problèmes avec ma requete SQL de mise a jour
    Par k750_b dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/02/2008, 23h22
  2. SQL Server, mise en ligne de plusieur données avec délimiteur
    Par manhattan.project dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/06/2007, 17h52
  3. Plantage SQL Server sur requete de mise a jour
    Par Laurent_75000 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/09/2005, 10h00
  4. [SQL server][TDbRichEdit] Mise à jours base de donnée
    Par Revan012 dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/06/2004, 12h12
  5. Automatiser la mise à jour de la bD SQL SERVER from Access
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2003, 15h23

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