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 :

Fonction INSERT INTO SELECT


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Fonction INSERT INTO SELECT
    Bonsoir,

    Bon voila, autant dire je suis une grosse quiche en SQL et comme toute bonne quiche je cherche ma Lorraine.

    Bref, je suis confronté à un problème et mon cerveau commence à chauffer. J'ai beau cherché, parcourir des forums je ne trouve rien qui m'aide. Alors je fais appelle à votre intelligence.

    Voici, je travaille sous MySQL avec un logiciel intitulé SQLyog.

    Je viens de créer deux tables (A et B) avec exactement la même structure. Un champ intitulé "key" est l'identifiant.

    Je souhaite rapatrier les lignes de la table B dans la table A. Sachant que si des lignes de la table B ont le même identifiant (présent dans le champ key) que des lignes de la table A, et ben je n'en veut pas !

    Alors je suppute au vue de mes recherches qu'il faut utiliser la fonction INSERT INTO mais j'ai bien tenté sans succès.

    Voici ma dernière tentative :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO tableA (*)
    SELECT tableB (*)
    WHERE tableB.key<>tableA.key
    J'utilise le (*) pour récupérer tout les colonnes de mes tables et le "<>" pour exclure les identifiants communs.


    Pouvez-vous m'éclairer ?

    Merci beaucoup.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Déjà, oublie les * dans la requête, c'est une grosse source de problème...

    Ensuite pour ignorer les lignes qui existent déjà (sur la clé primaire uniquement il me semble), il faut faire une exclusion dans la deuxième partie de la requête (avec une jointure, un not in, not exist...)*.

    Tatayo.

    * Avec MaxDB j'utilise IGNORE DUPLICATES, mais je ne sais pas si ça fait partie de la norme SQL.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ok pour les *, je vais donc renseigner les champs un à un.

    Pour ce qui concerne la jointure. Tu l'inclue dans la clause WHERE ?

    Ce qui donne qqchose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO tableA (champ1,champ2,key)
    SELECT tableB (champ1,champ2,key)
    WHERE NOT EXSIST tableB.key=tableA.KEY
    Ai-je juste ?

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    J'aurais fait quelque chose dans ce style (à adapter) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO tableA (id, champ1, champ2)
    SELECT id, champ1, champ2 
        FROM tableB
        WHERE id NOT IN (SELECT id FROM tableA);
    Sinon c'est pas une bonne idée d'utiliser des mots réservés au SQL comme nom de colonne (KEY)

    Cordialement,
    Idriss

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Hello,

    Merci pour ton aide. J'ai bien remplacé le champ key comme conseillé.

    Par contre en exécutant ma requête j'ai un message d'erreur in-interprétable ...

    Error Code : 1241
    Operand should contain 1 column(s)
    (0 ms taken)
    J'ai l'impression qu'il ne gère pas la requête avec l'ensemble des colonnes.

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Re salut.

    Peux tu nous montrer la structure exact de tes deux tables (show create table nom_table sous MySQL si je me souviens bien) ainsi que la requête qui a provoqué l'erreur (même si c'est la même que celle que j'ai posté, sait-on jamais) ?

    Merci.

    Idriss

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO sb_data_98 (ROWID,NUMERO,FEUILLE,SECTION,CODE_DEP,NOM_COM,CODE_COM,COM_ABS,CODE_ARR,keypar)
    SELECT (ROWID,NUMERO,FEUILLE,SECTION,CODE_DEP,NOM_COM,CODE_COM,COM_ABS,CODE_ARR,keypar)
    FROM sb_data_97
    WHERE keypar NOT IN (SELECT keypar FROM sb_data_98)
    Peut-être devrai-je mettre le nom des tables devant le keypar ?

    Par contre la requête pour la structure ne fonctionne pas, je vais essayer une autre.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Il me semble que ROWID est aussi un mot réservé en SQL, c'est peut-être l'origine de l'erreur.

    Tatayo.

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Referrez-vous à la doc de MySql : http://dev.mysql.com/doc/refman/5.5/...rt-select.html

    •The target table of the INSERT statement may appear in the FROM clause of the SELECT part of the query. (This was not possible in some older versions of MySQL.) However, you cannot insert into a table and select from the same table in a subquery.

    When selecting from and inserting into a table at the same time, MySQL creates a temporary table to hold the rows from the SELECT and then inserts those rows into the target table. However, it remains true that you cannot use INSERT INTO t ... SELECT ... FROM t when t is a TEMPORARY table, because TEMPORARY tables cannot be referred to twice in the same statement (see Section C.5.7.2, “TEMPORARY Table Problems”).
    Du coup, passez par une table temporaire ou une vue (pas sur que ca fonctionne) ?

Discussions similaires

  1. SQL : syntaxe insert into select
    Par chrislauxerrois dans le forum Access
    Réponses: 15
    Dernier message: 31/07/2006, 16h12
  2. [Oracle 9] Anomalie insert into select
    Par maxidoove dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/05/2006, 14h11
  3. probleme dans un INSERT INTO...........SELECT
    Par briiice dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/01/2006, 15h13
  4. Incrémenter champ : insert into . select max(.) + 1 from .
    Par ludo.guy dans le forum Langage SQL
    Réponses: 10
    Dernier message: 25/11/2004, 14h39
  5. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/11/2004, 17h32

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