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] Select insert ?


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Points : 14
    Points
    14
    Par défaut [Requête] Select insert ?
    Bonjour !

    Je viens vers vous car cela fait un moment que je me tourmente pour trouver une solution ...

    Voilà mon problème, je veux faire une 'migration' d'une table.
    En clair j'ai une clé avec un couple ID/Catégorie dans une table.
    L'ID n'est pas unique.

    Et j'ai besoin de passer tous les ID de la catégorie 1 vers la catégorie 2.
    J'ai une table de correspondance qui va bien.

    Mais je n'arrive pas à trouver comment utiliser un insert select pour faire un copie de l'ensemble.

    Voici ce que j'essaie de faire:



    Dans mes tentatives je vois bien comment faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO PERSONNES 
    (
      SELECT * 
      FROM PERSONNES P, MODIFICATION M 
      WHERE P.ID = M.ID_ORIGINE
    )
    Mais avec ça je ne peux pas modifier mes deux champs.


    Sachant que j'attaque la base par requête directement je ne suis pas connectée à des langages de script type PHP.

    Voilà, j'espère que quelque sera plus doué que moi et pourra m'aider à avancer !

  2. #2
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    déjà écrit une requête qui te ramène uniquement les enregistrements concernés par le transfert que tu met dans une table temporaire #TMP

    puis insert into (ID, Cat, ...) VALUE (2,#TMP.Cat , ...)

    C'est bourrin mais pour une requete à utiliser 1 fois ça permet de comprendre ce que tu fais
    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

  3. #3
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Bonjour,

    Il n'est pas nécessaire de passer par une table temporaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO PERSONNES (id, categorie, champ1, ..., champ10) (SELECT m.id_destination, m.categorie_destination, p.champ1, ..., p.champ10 FROM PERSONNES P, MODIFICATION M WHERE P.ID = M.ID_ORIGINE)
    Cette méthode n'est juste bien sûr que si votre table modification contient bien tous les id de la table personnes.
    Vous pouvez le vérifier comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM personnes p WHERE NOT EXISTS (SELECT * FROM modification m WHERE P.ID = M.ID_ORIGINE)
    Cordialement,

    Arkhena
    A bove ante, ab asino retro, a stulto undique caveto

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Merci de vos réponses rapides !

    Je dois bien avoué que je n'ai pas super compris la première ...
    Le but serait de mettre dans la table tampon toutes les personnes concernées par la table de modification ?

    Donc un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     create table tmp as (select p.* from personnes p, modification m where p.id = m.id_origine)
    Suivit par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update tmp t, modification m set p.categorie = m.categorie_destination, t.id = m.id_destination where t.id = m.id_origine
    Et enfin modifier l'originale avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into personnes select * from tmp
    ?


    Pour la deuxième suggestion.
    La table de modification ne comprendra pas TOUS les id de la table personnes.
    une sélection sera concernée par cette migration.
    Mais je ne vois pas pourquoi cela gène qu'ils ne soient pas tous présents.

  5. #5
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par Pandalex Voir le message
    La table de modification ne comprendra pas TOUS les id de la table personnes.
    une sélection sera concernée par cette migration.
    Mais je ne vois pas pourquoi cela gène qu'ils ne soient pas tous présents.
    Au temps pour moi, j'avais mal compris le besoin, je ne savais pas que vous ne vouliez pas migrer toutes les personnes. Ce qui est important c'est que votre table de migration soit exhaustive.
    A bove ante, ab asino retro, a stulto undique caveto

  6. #6
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Oui le but est de migrer l'intégralité de la table de migration.
    Avec peut-être un filtre sur l'état.

  7. #7
    Membre chevronné
    Avatar de Pelote2012
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2008
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2008
    Messages : 925
    Points : 1 839
    Points
    1 839
    Billets dans le blog
    2
    Par défaut
    l'idée de la table tampon sert à vérifier que t'as bien quelque chose à remonter
    Si débugger est l'art d'enlever les bugs ... alors programmer est l'art de les créer

  8. #8
    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
    Les données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    create table personnes
    (
        id        varchar(3)
      , categorie varchar(2)
      , col1      int
      , col2      int
    );
     
    insert into personnes (id, categorie, col1, col2)
    select 'A1', 'S1', 6, 4 union all
    select 'A1', 'S2', 5, 8 union all
    select 'A2', 'S1', 5, 7 union all
    select 'A2', 'S2', 4, 9;
     
     
    create table modification_id
    (
        id_origine            varchar(2)
      , id_destination        varchar(3)
      , categorie_origine     varchar(2)
      , categorie_destination varchar(2)
      , etat                  int
    );
     
    insert into modification_id (id_origine, id_destination, categorie_origine, categorie_destination, etat)
    select 'A1', 'AD1', 'S1', 'S2', 0 union all
    select 'A2', 'AD2', 'S1', 'S2', 0 union all
    select 'A3', 'AD3', 'S1', 'S2', 0 union all
    select 'A4', 'AD4', 'S1', 'S2', 1 union all
    select 'A5', 'AD5', 'S1', 'S2', 0;
    La transaction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    begin transaction
     
    insert into personnes (id, categorie, col1, col2)
        select m.id_destination, m.categorie_destination, p.col1, p.col2
          from personnes       as p
    inner join modification_id as m
            on m.id_origine        = p.id
           and m.categorie_origine = p.categorie
         where m.etat = 0;
     
    update modification_id
       set etat = 2
     where etat = 0;
     
    commit transaction
    Vérification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    select * from personnes;
     
    id   categorie col1        col2
    ---- --------- ----------- -----------
    A1   S1        6           4
    A1   S2        5           8
    A2   S1        5           7
    A2   S2        4           9
    AD1  S2        6           4
    AD2  S2        5           7
     
    select * from modification_id;
     
    id_origine id_destination categorie_origine categorie_destination etat
    ---------- -------------- ----------------- --------------------- -----------
    A1         AD1            S1                S2                    2
    A2         AD2            S1                S2                    2
    A3         AD3            S1                S2                    2
    A4         AD4            S1                S2                    1
    A5         AD5            S1                S2                    2
    Je ne sais pas ce que vous voulez faire avec les modifications qui ont un état 1.

  9. #9
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Points : 14
    Points
    14
    Par défaut
    Ne rien en faire pour le moment

    Ca me semble parfait en tout cas merci beaucoup, je vais tester tout ça.

    Par contre quel est l'interêt d'un INNER JOIN - AS - ON
    Plutôt qu'un simple FROM table1 t1, table2 t2 WHERE - ?

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Par contre quel est l'interêt d'un INNER JOIN - AS - ON
    Plutôt qu'un simple FROM table1 t1, table2 t2 WHERE - ?
    Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    C'est beaucoup plus lisible avec JOIN quand il y a de multiples jointures et ça limite les erreurs à l'écriture. Bref c'est beaucoup mieux !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Juin 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Juin 2012
    Messages : 23
    Points : 14
    Points
    14
    Par défaut

  12. #12
    Membre éclairé Avatar de Arkhena
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 552
    Points : 769
    Points
    769
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    C'est beaucoup plus lisible avec JOIN quand il y a de multiples jointures et ça limite les erreurs à l'écriture. Bref c'est beaucoup mieux !
    +1
    A bove ante, ab asino retro, a stulto undique caveto

Discussions similaires

  1. [MySQL] Requête avec insert et select
    Par saaraa dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/01/2014, 17h22
  2. Insert multiples avec sous-requête SELECT
    Par lolymeupy dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/08/2011, 17h57
  3. Réponses: 1
    Dernier message: 28/04/2009, 09h57
  4. Insertion à base de sous requête select
    Par imane_bennouna dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2006, 12h03
  5. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34

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