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 complexe avec la même table en tant que cible et source


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 21
    Points : 19
    Points
    19
    Par défaut UPDATE complexe avec la même table en tant que cible et source
    Bonjour à tous,

    Je cherche à faire un UPDATE dans une table volumineuse qui consiste à remplacer tous les idSousCategorieRelation=80 qui sont suivis dans l'occurrence suivante par idSousCategorieRelation=1 , par idSousCategorieRelation=79.

    Ainsi, dans la séquence de l'image ci-dessous, seul le idSousCategorieRelation=80 avec idRelation=1196992 doit être remplacé par 79... et non pas le idSousCategorieRelation=80 avec idRelation=1196997 car celui-ci est suivi de 2 et non de 1 !

    Or, la requête suivante ne marche pas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE bdu_schema_categories_sous_relation as ssrel1
    SET ssrel1.idSousCategorieRelation=79 WHERE ssrel1.idSousCategorieRelation=80 AND ((`idRelation`+1) IN (SELECT idRelation FROM bdu_schema_categories_sous_relation as ssrel2 WHERE ssrel2.idSousCategorieRelation=1))
    MySQL a répondu : #1093 - Table 'ssrel1' is specified twice, both as a target for 'UPDATE' and as a separate source for data

    Qqun de sympa pourrait-il m'aider SVP ?

    Nom : 2017-01-20_15h32_12.jpg
Affichages : 730
Taille : 106,4 Ko

  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 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    MySQL qui est un ersatz de SGBDR (a me lire http://blog.developpez.com/sqlpro/p9...oudre_aux_yeux) est très limité en matière de SQL (il en est toujours à avant le norme SQL 2 de 1992 ! pour certaines fonctionnalité comme les schéma SQL) et de possibilité de requête...
    Je ne pense pas que vous puissiez effectivement avoir la source et la cible dans la même requête UDPATE.
    Vous avez donc deux choix possibles :
    • changer de SGBD pour un vrai SGBDR comme SQL Server ou PostGreSQL
    • bricoler votre traitement en utilisant une table temporaire intermédiaire...


    Ce sont les joies de cette daube !

    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
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Oui je crois bien que vous ayez raison SQLpro...

    Je vais quand-même essayer avec la "Temporary Table", cela m'ayant été suggéré par ailleurs.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    En fin de compte on y est arrivé quand-même...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE schema_categories_sous_relation
    SET `idSousCategorieRelation` = 79 WHERE `idSousCategorieRelation` = 80
    AND (`idRelation` + 1 ) IN (
     SELECT `idRelation` 
     FROM (SELECT * FROM schema_categories_sous_relation) AS schema_categories_sous_relation
     WHERE `idSousCategorieRelation` = 1 )

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    C'est une mauvaise idée de faire un test d'existence en utilisant WHERE IN (requete)surtout si la requête imbriquée est un select *

    Essayez plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE schema_categories_sous_relation MAIN
    SET   idSousCategorieRelation = 79 
    WHERE idSousCategorieRelation = 80
      AND exists
         (select 1
          FROM schema_categories_sous_relation SUBQ
          WHERE SUBQ.idSousCategorieRelation = 1 
            AND SUBQ.idRelation = MAIN.idRelation + 1)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Merci pour ton aide escartefigue

    Par contre c'est bien 1 et non pas * après le SELECT... ?

    (j'avoue ne pas trop comprendre...)

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2015
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    J'obtiens une erreur avec cette syntaxe :

    Table 'MAIN' is specified twice, both as a target for 'UPDATE' and as a separate source for data

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par kris92130 Voir le message
    Merci pour ton aide escartefigue

    Par contre c'est bien 1 et non pas * après le SELECT... ?

    (j'avoue ne pas trop comprendre...)
    Pour un test d'existence (EXISTS) ou de non existence (NOT EXISTS), on peut mettre ce que l'on veut : select 1, select *, select "kikenveux de mes pâtes aux œufs", dans tous les cas, le résultat est un booléen



    Citation Envoyé par kris92130 Voir le message
    J'obtiens une erreur avec cette syntaxe :
    Table 'MAIN' is specified twice, both as a target for 'UPDATE' and as a separate source for data
    Dommage alors que MySQL refuse cette syntaxe bien pratique et beaucoup plus performante qu'un subselect avec IN

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

Discussions similaires

  1. [AC-2010] relation double avec la même table
    Par mir286 dans le forum Modélisation
    Réponses: 3
    Dernier message: 06/05/2010, 23h01
  2. Plusieurs jointures avec une même table
    Par bstevy dans le forum Développement de jobs
    Réponses: 6
    Dernier message: 10/11/2009, 15h10
  3. Réponses: 3
    Dernier message: 12/06/2007, 23h31
  4. Requête UPDATE qui rappelle la même table
    Par Linio dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/06/2007, 09h54
  5. Réponses: 2
    Dernier message: 29/09/2004, 09h07

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