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 :

Mise à jour table avec données de la même table. Requêtes imbriquées?


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut Mise à jour table avec données de la même table. Requêtes imbriquées?
    Bonjour,

    J'ai une table mal foutue que j'aimerais mettre à jour:




    Sachant que pour chaque mot, j'ai un niveau (imaginez un arbre de mots englobant d'autres), un nom ("name"), et surtout un ancien ID "id" (on trouve des doublons car un ID dépend du niveau, totalement débile), un parent_id (l'ID du mot "parent"), et un "newid" que j'ai rajouté pour mettre à jour la structure, et qui est bien unique quelque soit le mot et son niveau.

    Donc, ce que je souhaiterais c'est mettre à jour le "parent_id" avec le newid du mot parent correspondant.
    Je n'arrive pas à construire la requête
    J'avais pensé à utiliser des requêtes imbriquées mais je n'y arrive pas,
    une idée?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Citation Envoyé par geekforever Voir le message
    Sachant que pour chaque mot, j'ai un niveau (imaginez un arbre de mots englobant d'autres), un nom ("name"), et surtout un ancien ID "id" (on trouve des doublons car un ID dépend du niveau, totalement débile)
    Ce n'est pas débile, vous avez une clef primaire sur deux colonnes.
    Il n'y a rien de choquant.

    Evidement si vous devez faire référence avec un parent, il faut le parent_level_id et le parent_id.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ce n'est pas débile, vous avez une clef primaire sur deux colonnes.
    Il n'y a rien de choquant.

    Evidement si vous devez faire référence avec un parent, il faut le parent_level_id et le parent_id.
    Peut être, mais cela ne répond pas à ma question...

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Précisez alors votre SGBD, et surtout donnez la règle de gestion parce qu'en regardant votre table, je ne la devine pas (avec des exemples c'est encore mieux).

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Le SGBD est PostGres
    Je n'ai pas de clef primaire ou de clef étrangère pour cette table:



    avec l'exemple du dessus,
    sachant que le nouveau id "newid" du mot parent ("Women's contribution to production") est 32, j'aimerais changer le parent_id des mots enfants "Womens' fieldwords" et "Change in women's contribution" avec 32

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE MaTable M1
       SET M1.Parent_Id = (SELECT M2.NewId
                             FROM MaTable M2
                            WHERE M2.Level_Id = M1.Level_Id - 1
                              AND M2.Id       = M1.Parent_Id   );

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Par règle de gestion, je pense que Waldar demandait plutôt comment identifier un parent. A voir votre exemple, je dirai parent_id = id et level = level+1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    update arbre enfant
    set enfant.parent_id = (select parent.newid from arbre parent where enfant.parent_id = parent.id and enfant.level_id = parent.level_id+1)
    La clé porte sur le couple level/id probablement pour s'épargner de la recursivité à l'affichage. Si vous ne supprimez pas l'info level_id et ne modifiez pas l'appli en conséquence, il n'y a pas vraiment d'intérêt à créer un id sur une seule colonne.

    EDIT : devancé, mon indentation est moins soignée en plus

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 37
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE MaTable M1
       SET M1.Parent_Id = (SELECT M2.NewId
                             FROM MaTable2 M2
                            WHERE M2.Level_Id = M1.Level_Id - 1
                              AND M2.Id       = M1.Parent_Id   );
    Avec MaTable2 comme duplication de la table MaTable, ça marche!
    Merci pour votre aide.

    Citation Envoyé par Snipah Voir le message
    Si vous ne supprimez pas l'info level_id et ne modifiez pas l'appli en conséquence, il n'y a pas vraiment d'intérêt à créer un id sur une seule colonne.
    Et si, il est question de faire des modifications sur cet arbre, la définition d'un ID sur une seule colonne ne fera que simplifier les requêtes

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Citation Envoyé par Snipah Voir le message
    EDIT : devancé, mon indentation est moins soignée en plus
    J'indente donc je suis

    Citation Envoyé par geekforever Voir le message
    Avec MaTable2 comme duplication de la table MaTable, ça marche!
    Pas besoin de dupliquer la table, vous avez le droit d'appeller une table plusieurs fois dans une même requête !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/05/2015, 17h30
  2. Mise à jour d'une donnée sur une table
    Par demande001 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/07/2011, 13h36
  3. [MySQL] Variable PHP dans formulaire avec mise à jour base de données
    Par flingue dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 28/11/2009, 07h54
  4. Réponses: 14
    Dernier message: 05/09/2006, 17h01
  5. mise à jours Acces avec données interbase
    Par milielf dans le forum InterBase
    Réponses: 6
    Dernier message: 19/06/2006, 14h49

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