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 :

[SQLSERVER2005] Update "for each"


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 20
    Points
    20
    Par défaut [SQLSERVER2005] Update "for each"
    Bonjour,

    Je souhaite faire un update sur un champs d'une table, qui doit reprendre une donnée provenant d'une table de liaison comprenant l'id de la première table

    Pourquoi faire ceci, car la table de liaison est devenue inutile, le but est donc de rapatrier les données dans la première table avant de l'effacer

    Table Employes
    employe_id
    nom
    prenom
    service_id

    Table Service_Employe
    service_id
    employe_id


    Au départ je cherchais à faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    update dbo.EMPLOYES 
    set SERVICE_ID =
    (
    select es.SERVICE_ID
    from dbo.EMPLOYE_SERVICE es, dbo.EMPLOYES e
    where e.EMPLOYE_ID = es.EMPLOYE_ID
    )
    Ca ne fonctionne pas car la sous requête renvoit plusieurs lignes (autant que le nombre de ligne de la table Employes)

    Pour résoudre cela, j'ai regardé du côté des curseurs, mais j'avoue coincer, d'une part pour la syntaxe, et d'autre part car je ne suis pas sur d'avoir compris la "logique" curseur


    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
    DECLARE @id int
    DECLARE Employee_Cursor CURSOR FOR
    SELECT EMPLOYE_ID,  SERVICE_ID
    FROM dbo.EMPLOYES
    OPEN Employee_Cursor;
    FETCH NEXT FROM Employee_Cursor;
    WHILE @@FETCH_STATUS = 0
       BEGIN
    		set @id = select employe_id from dbo.EMPLOYES WHERE CURRENT OF Employee_Cursor
    		update dbo.EMPLOYES
    		set SERVICE_ID =
    		(
    			select es.SERVICE_ID
    			from dbo.EMPLOYE_SERVICE es where dbo.employes.employe_id = @id
    		)
    		WHERE CURRENT OF Employee_Cursor
          FETCH NEXT FROM Employee_Cursor;
       END;
    CLOSE Employee_Cursor;
    DEALLOCATE Employee_Cursor;
    L'idée repose dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set @id = select employe_id from dbo.EMPLOYES WHERE CURRENT OF Employee_Cursor
    qui ne fonctionne pas, mais il est là pour exprimer ce que je souhaite faire

    Pour résumer, pour chaque ligne de la table Employe, je souhaite renseigner la colonne "service_id" avec la valeur correspondante dans la table de liaison
    1 employé ne peut se trouver que dans 1 seul service

    Merci d'avance pour les aides, suggestions et autres !

  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
    21 766
    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 : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE dbo.EMPLOYES 
    SET SERVICE_ID = es.SERVICE_ID
    FROM   dbo.EMPLOYES e
           INNER JOIN dbo.EMPLOYE_SERVICE es
                 ON e.EMPLOYE_ID = es.EMPLOYE_ID
    1) apprenez à faire des JOINS. Cette syntaxe fait partie de la norme SQL depuis 1992 !!!!

    2) vous pouvez utiliser le principe de corrélation implicite entre table cible et alias source en ajoutant directement une clause FROM dans l'UPDATE.

    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 à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    merci

  4. #4
    Membre averti Avatar de voran
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 242
    Points : 346
    Points
    346
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    ...
    1) apprenez à faire des JOINS. Cette syntaxe fait partie de la norme SQL depuis 1992 !!!!
    ...
    Et ça va plus vite ???

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

Discussions similaires

  1. utilisation de for each
    Par billoum dans le forum ASP
    Réponses: 5
    Dernier message: 19/03/2004, 15h30
  2. [VB6] For Each ... In ...
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/02/2003, 12h56

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