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 :

Problème avec un update


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Août 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Problème avec un update
    Bonjour à toutes et à tous.

    Je bloque sur une requête qui à la première lecture me semblait plutôt simple.

    J'ai une table MATERIEL contenant les champs (idmat (clé primaire), idemploye (clé externe), idservice (clé externe), idlocalisation (clé externe)).
    J'ai une autre table EMPLOYE contenant les champs (idemploye (clé primaire), idservice (clé externe)).

    Un matériel appartient à un seul et unique employé et un employé peut avoir 0 ou plusieurs matériel.
    Un matériel appartient à un service. Un employé appartient à un service. Ainsi un matériel peut appartenir à un service différent de son propriétaire.

    Je souhaite mettre à jour les matériels pour lesquels le champ idservice est différent de l'idservice de l'employé à qui il appartient et cela pour une localisation donnée.

    Donc j'ai commencé à faire ma requête pour obtenir les idservice souhaités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select EMPLOYE.idservice
    from MATERIEL, EMPLOYE
    where MATERIEL.idemploye= EMPLOYE.idemploye
    and MATERIEL.idlocalisation ='3263'
    (NB : Il est vrai que j'aurai pu ne sélectionner que ceux dont l'idservice est différent mais ça m'importe peu.)

    Par la requête ci-dessus j'obtiens donc une liste.

    Machinalement, je commence à écrire mon Update :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE MATERIEL
    Set MATERIEL.idservice=(Select EMPLOYE.idservice
    from MATERIEL, EMPLOYE
    where MATERIEL.idemploye= EMPLOYE.idemploye
    and MATERIEL.idlocalisation ='3263')
    Sauf qu'évidemment ça ne marche pas car j'ai une liste et il me faut obtenir une valeur dans ce genre d'update !

    Et là je coince ... En php, je sais faire ma boucle sans problème mais du coup ce genre d'opération est-il possible en SQL ?

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    il faut en effet corréler votre sous requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE MATERIEL
    SET MATERIEL.idservice=(
        SELECT EMPLOYE.idservice
        FROM EMPLOYE
        WHERE  EMPLOYE.idemploye =MATERIEL.idemploye
    )
    WHERE MATERIEL.idlocalisation ='3263'
    D'autres solutions sont possibles, mais la syntaxe diffère entre les SGBD

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Août 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse et pour la correction des balises !!

    En fait avec du recul la solution est plus simple que la requête imbriquée !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE MATERIEL
    Set MATERIEL.idservice=EMPLOYE.idservice
    From MATERIEL, EMPLOYE
    WHERE MATERIEL.idemploye=EMPLOYE.idemploye
    AND MATERIEL.idlocalisation ='3263'
    Je ne sais pas pourquoi, je bloquais avec cette requête imbriquée !

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Oui, c'est à ce type de solution que je faisais allusion, mais elle n'est pas acceptée par tous les les SGBD.

    Par ailleurs, deux remarques :
    1/ préférez les jointures normalisées (INNER JOIN )
    2/ si idlocalisation est de type numérique, supprimez les guillements

Discussions similaires

  1. [MySQL] problème avec un update
    Par soork dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/04/2007, 12h22
  2. [MySQL] Problème avec un update
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 21/09/2006, 10h09
  3. Problème avec un update et un champs
    Par kornmuse90 dans le forum Requêtes
    Réponses: 3
    Dernier message: 27/03/2006, 15h55
  4. [VB6] Problème avec requête Update
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 02/02/2006, 03h40

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