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

Requêtes MySQL Discussion :

probleme update avec where sur requete imbriqué


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 57
    Par défaut probleme update avec where sur requete imbriqué
    Je n'arrive pas à éxecuter une requete UPDATE ou le nom de la table figure dans la clause WHERE. J'utilise PHPmyadmin, ma requete est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE repertoires SET OUVERT='0' WHERE ID IN (SELECT ID FROM repertoires WHERE PARENTID IN ('1'))
    message d'erreur : You can't specify target table 'repertoires' for update in FROM clause

    Je n'ai pas envie de me taper une table temporaire, y'a t il une autre solution ?[/code]

  2. #2
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Salut,

    Tu ne remarques pas comme une redondance dans cette requête :

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 57
    Par défaut
    Excusez mon ignorance, je débute. Cela dit je ne comprends pas pourquoi cette requête ne fonctionne pas. Je l'ai pourtant écrite intuitivement et elle devrait faire exactement ce que je voudrais qu'elle fasse. Alors redondance ou pas, je trouve dommage qu'un language aussi intuitif que le SQL ne permette pas ce genre de requête. A savoir 1) recherche des 'ID' dont le 'PARENTID' vaut 1 puis 2) modification de la valeur 'OUVERT' des lignes sélectionnées. Doit bien y avoir un moyen de faire ça non ?

  4. #4
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Hm intuitivement sa donnerai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE repertoires SET OUVERT='0' WHERE PARENTID = 1
    non ?

    Sinon le IN c'est à utiliser pour trouver une champs dont la valeur est égale à une occurence d'une liste de valeur.

    Et puisque PARENTID semble être un identifiant, à priori numérique, tu n'as pas besoin des simple quote.

  5. #5
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Citation Envoyé par JulienCEA
    Cela dit je ne comprends pas pourquoi cette requête ne fonctionne pas.
    Un problème de version surement (requêtes imbriquées pas supportées avant MySQL 4.1)

    Citation Envoyé par JulienCEA
    Je l'ai pourtant écrite intuitivement...
    Le meilleur moyen pour avoir des problèmes de version (requêtes imbriquées), de performances et autres. Etre programmeur, c'est pas juste "traduire mot à mot un cahier des charges", c'est aussi réfléchir sur les ensembles... (et prendre en compte plein de paramètres)

    Là où Maximillian veut en venir, c'est que la requête suivante est suffisante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE repertoires SET OUVERT='0' WHERE PARENTID IN (1) ;
    Elle est:
    - simple
    - intuitive
    - performante
    - compatible avec les anciennes versions de MySQL

    Edit: Grillé par ePoX
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  6. #6
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Citation Envoyé par pcaboche
    Un problème de version surement (requêtes imbriquées pas supportées avant MySQL 4.1)
    petite précision (je vous en fait profiter comme je suis allé me renseigner)

    Error 1093 (ER_UPDATE_TABLE_USED)
    SQLSTATE = HY000
    Message = "You can't specify target table 'x' for update in FROM clause"

    Cette erreur survient dans des cas comme celui-ci :

    UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);

    Il est valide d'utiliser une sous-requête lors d'une affectation dans une commande UPDATE, car les sous-requêtes sont valides avec les commandes UPDATE et DELETE, tout comme dans les commandes SELECT. Cependant, vous ne pouvez pas les utiliser sur la même table, qui est ici t1, car cette table est alors la cible de la clause FROM et de la commande UPDATE.
    Pour mysql 5.

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Donc, si je comprends bien, les requêtes imbriquées ne sont utilisables dasn un UPDATE et un DELETE qu'à partir de MySQL 5?

    Dans ce cas, ça répond à la question "pourquoi ça marche pas?".

    Merci pour cette précision ePoX !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  8. #8
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    eeuuuuuhhh je n'est pas été assez précis :s dsl

    En faits les requetes imbriquées avec les clauses UPDATE DELETE sont utilisable avec mysql 3, 4, 5 (enfin ce n'est pas très précis dans la doc http://dev.mysql.com/doc/refman/4.1/en/subquery-errors.html la dernière erreur)

    Par contre on ne peut pas faire un update sur une table et utiliser cette même table dans la sous requete !

    C'était ce que je voulais préciser.

    dsl

  9. #9
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Okay ! We learn a new thing everyday !
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur Hospitalier
    Inscrit en
    Juillet 2004
    Messages
    993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Hospitalier
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 993
    Billets dans le blog
    1
    Par défaut BLABLA
    on utilise les alias pour les sous requetes.
    et ca marchera.

  11. #11
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2
    Par défaut
    pour info, évite l'espace entre IN et la parenthèse :
    IN(1)

  12. #12
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Par défaut
    Utiliser les alias ne change rien.

    D'après ce thread, il faut passer par une table intermédiaire...

    [edit]
    A ce propos, si quelqu'un à une idée pour faire passer cette requête, qu'il n'hésite pas.

    update mvt_jus_std t1 set timestamp = (select max(TIMESTAMP) from mvt_jus_std t2 where t1.date_jus=t2.date_jus and t1.oid_perso=t2.oid_perso)

    Marche sous Oracle, marche pas sous MySQL, avec le fameux :

    You can't specify target table ... for update in FROM clause

    [edit 2]

    Bin voilà la soluce, avec table temporaire :
    update MVT_JUS_STD set timestamp = (
    select max_timestamp from (
    (select MAX(timestamp) max_timestamp, oid_perso, date_jus from MVT_JUS_STD group by date_jus,oid_perso)temp
    ) where MVT_JUS_STD.oid_perso=temp.oid_perso and temp.date_jus=MVT_JUS_STD.date_jus)

Discussions similaires

  1. Requete UPDATE avec SELECT sur 2 champs
    Par ngstudio dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/09/2009, 14h47
  2. [UPDATE] avec jointure sur une requete
    Par userB dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 20/07/2007, 16h18
  3. [MySQL] Probleme sur requetes imbriquées
    Par joxbl dans le forum Langage SQL
    Réponses: 41
    Dernier message: 12/04/2006, 17h20
  4. update avec condition sur autre table
    Par allowen dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/04/2005, 15h02
  5. UPDATE avec condition sur d'autres tables
    Par guda dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/03/2005, 11h20

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