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 :

Requète UPDATE avec sous-requète dans la même table.


Sujet :

Langage SQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut Requète UPDATE avec sous-requète dans la même table.
    Bonjour,

    Voici mon problème. J'ai une table 'table' qui représente un arbre de données, avec donc comme champs 'id' et 'parent_id'. Comme je suis amené à importer des données depuis une autre base, j'ai adopté le protocole suivant : j'importe litéralement la structure d'arbre de l'autre base en renomant les champs 'id' et 'parent_id' en 'id_old' et 'parent_id_old'. Un fois que tout est importé et que mes éléments importés se sont vu attribuer un nouvel 'id', je fais le branchement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE  `table` 
    SET `parent_id` = 
     ( SELECT `table`.id 
       FROM `table` 
       WHERE `table`.id_old=`parent_id_old` LIMIT 1 ) 
    WHERE `parent_id` IS NULL ;
    Cette requète marche parfaitement quand le branchement ne se fait pas sur la même table car il n'y a pas confusion des noms. Mais dans ce cas précis, je ne sais pas comment faire comprendre sur qui porte quoi.

    Pouvez-vous m'aider ?

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Aliaser vos tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE table as T1
    SET T1.parent_id = (SELECT t2.id FROM table as t2 WHERE t2.id_old = t.parent_id_old LIMIT 1 ) -- pourquoi limit 1 ?
    WHERE t1.parent_id IS NULL;

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Merci pour votre réponse !

    Cependant, j'avais bien pensé à cela mais il y a deux problèmes :
    - sqlite3 refuse la déclaration d'un alias après un UPDATE
    - mysql donne une erreur : ERROR 1093 (HY000): You can't specify target table 't1' for update in FROM clause.

    Qu'en pensez-vous ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Essayez peut-être sans les AS, certains SGBD ne les acceptent pas en alias de table.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Août 2003
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 247
    Points : 276
    Points
    276
    Par défaut
    Pas mieux...
    Pour l'instant je crée un table temporaire en guise de rustine...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Désolé, n'ayant pas de MySQL sous la main je ne peux vous aider plus.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    je te propose ceci sans l'avoir tester sur mysql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE TABLE1 
    SET parent_id = (SELECT t2.id 
                          FROM TABLE1 AS t2 
                          WHERE t2.id_old = TABLE1.parent_id_old )
    WHERE parent_id IS NULL;
    A+

Discussions similaires

  1. update avec sous requête sur la même table
    Par beyo dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2012, 14h21
  2. Requête update avec un select sur la même table
    Par sheira dans le forum Requêtes
    Réponses: 6
    Dernier message: 15/09/2010, 16h09
  3. Réponses: 3
    Dernier message: 25/05/2009, 17h11
  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