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 :

Update avec sous requête


Sujet :

Langage SQL

  1. #1
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut Update avec sous requête MySQL
    Bonjour,

    je suis en train de buter sur une requête update. Le principe est de modifier les champs d'une table, en fonction d'un retour d'une autre requête. Voilà ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE ft_staff_mission c SET c.calendar_flag = 1 
    WHERE c.calendar_flag = 0
     AND c.id in ( 
    SELECT m.id FROM ft_staff,ft_staff_mission m 
    WHERE ft_staff.id = m.idseeker 
    AND ft_staff.idteam = '16'
     AND m.end < UNIX_TIMESTAMP() 
    )
    Le problème est que j'obtiens cette erreur : You can't specify target table 'c' for update in FROM clause.

    Néanmoins, il me semblait bien possible d'utiliser la même table dans ma sous requete que dans mon update. Est-ce une erreur dans mon SQL, où est-ce vraiment pas faisable ?

    Merci pour votre aide
    Cordialement

    Finality

  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 837
    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 837
    Points : 52 930
    Points
    52 930
    Billets dans le blog
    5
    Par défaut
    1) une table cible de mise à jour ne peut pas être aliassée !
    2) faites vos jointures avec des joins
    3) UNIX_TIMESTAMP n'est pas une fonction SQL.

    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
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Salut

    Désolé pour la fonction UNIX_TIMESTAMP, c'est une procédure stockée que j'ai dans ma BDD (pour des raisons spécifiques).

    Pour la jointure c'est fait dans la précipitation, juste pour tester ce problème de table... Donc en modifiant ma requête pour ne plus aliasser ma table cible, j'ai toujours ce problème... Est-ce normal ?

  4. #4
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Je crois que vous utilisez MySQL.
    MySQL ne permet pas sur les requêtes INSERT, UPDATE, DELETE d'avoir une sous-requête comportant la table qui est visée par la requête principale.

    Il y a quelques solutions:

    - Utiliser une table dérivée dans la sous-requête
    Remplacer "ft_staff_mission m" par "(SELECT * FROM ft_staff_mission) AS m"

    - Utiliser la syntaxe de jointure (avec la sous-requête)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE t1, t2
    SET ...
    WHERE ...
    - Utiliser une table temporaire

  5. #5
    Rédacteur

    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 494
    Points : 1 057
    Points
    1 057
    Par défaut
    Salut Oishiiii,

    Tout à fait, j'utilise bien MySQL et je n'étais pas au courant de cette spécificité. J'ai donc décidé d'utiliser une table dérivée et ça fonctionne parfaitement

    Merci à tous ceux qui m'ont aidé
    Bonne soirée

    Finality

    EDIT : titre édité pour une meilleure recherche

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Et ce code ne passait pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE ft_staff_mission SET calendar_flag = 1 
    WHERE calendar_flag = 0
     AND id IN ( 
    SELECT m.id FROM ft_staff,ft_staff_mission m 
    WHERE ft_staff.id = m.idseeker 
    AND ft_staff.idteam = '16'
     AND m.end < UNIX_TIMESTAMP() 
    )

  7. #7
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Citation Envoyé par GoustiFruit Voir le message
    Et ce code ne passait pas ?
    Non, elle ne peux pas passer sur MySQL, pour la raison évoquée plus haut.

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

Discussions similaires

  1. Requète UPDATE avec sous-requète dans la même table.
    Par Selenite dans le forum Langage SQL
    Réponses: 6
    Dernier message: 16/03/2009, 15h04
  2. Requete UPDATE avec sous-requète
    Par alaingui dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2008, 21h16
  3. UPDATE avec sous requête de sélection avec regroupement
    Par Maxsen dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2008, 11h20
  4. [FB2]Update avec sous requête resultat ?
    Par AuBozon dans le forum SQL
    Réponses: 1
    Dernier message: 29/02/2008, 21h04
  5. Requête Update avec Sous-requête
    Par Yohann_x dans le forum Requêtes
    Réponses: 8
    Dernier message: 16/02/2008, 13h19

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