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

  1. #1
    Membre expert
    INSERT avec des données qui viennent de 2 tables
    Bonsoir,

    Pour effectuer cela, m'inspirant de ce que m'avait dit CinePhil dans la discussion https://www.developpez.net/forums/d2093017/bases-donnees/mysql/requetes/convertir-2-requetes-selectpupdate-seul-update-jointure/ post #3, j'ai essayé ça :

    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TEMPORARY TABLE temp
    SELECT user_key 
    FROM `user`
    WHERE email="pierre.durand@schneider-electric.com";
     
    INSERT INTO `user` (`sesa`,`lastname`,`firstname`,`email`,`company`,`buunitname`,`location`,`manager_key`)
    SELECT
    ('100008','dupont','jean','jean.dupont@schneider-electric.com','Schneider Electric France','Industry Business','CARROS HORIZON',user_key)
    from temp where email="pierre.durand@schneider-electric.com"


    mais ça me donne le message d'erreur suivant :
    Operand should contain 1 column(s)
    Le but est d'insérer 8 colonnes ; pour les 7 premières, j'attribue une valeur mais pour la dernière (manager_key), la valeur est censée être générée par la sous-requête select utilisée dans la création de la table temporaire.
    Comment faut-il s'y prendre, SVP ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Membre expert
    Si pas moyen de le faire en une seule requête, autant faire au plus simple...

    Code php :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
             $sql_select = <<<sql
    SELECT user_key from user WHERE email={$ppp($manager_email)} 
    sql;
     
            $manager_key = $ppp->insert($sql_select);
     
            $sql_insert = <<<sql
    INSERT INTO `user` (`sesa`,`lastname`,`firstname`,`email`,`company`,`buunitname`,`location`,`manager_key`)
    VALUES
    ({$ppp($sesa)},
    {$ppp($lastname)},
    {$ppp($firstname)},
    {$ppp($email)},
    {$ppp($company)},
    {$ppp($buunitname)},
    {$ppp($location)},
    {$ppp($manager_key)} )
    sql;

    Mais si moyen de le faire en une seule requête, je suis preneur.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  3. #3
    Membre actif
    La table temporaire n'est pas nécessaire.
    Par ailleurs, ce qui pose problème c'est la parenthèse ouvrante qui suit le SELECT dans la clause INSERT (et évidemment la parenthèse fermée associée).
    En résumé :
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO user (sesa,lastname,firstname,email,company,buunitname,location,manager_key)
    SELECT
    '100008','dupont','jean','jean.dupont@schneider-electric.com','Schneider Electric France','Industry Business','CARROS HORIZON',manager_key
    from user  where email="pierre.durand@schneider-electric.com"

    devrait être largement suffisant (notez par ailleurs les cotes qui ont été expurgées).

  4. #4
    Membre expert
    Merci pour votre réponse. Avec cette requête, plus de message d'erreur, mais pas d'insertion non plus

    Vous êtes sûre de la fin ? Car l'insertion se fait bien avec
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO user (sesa,lastname,firstname,email,company,buunitname,location,manager_key)
    SELECT
    '100008','dupont','jean','jean.dupont@schneider-electric.com','Schneider Electric France','Industry Business','CARROS HORIZON',1


    (Les cotes venaient simplement d'un copier-coller depuis Mysql Workbench (mon outil pour gérer la bdd) )
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  5. #5
    Expert éminent sénior
    Bonjour,

    il y a une erreur dans la clause de restriction : les doubles quotes doivent être remplacées par des simples
    Les doubles quotes sont à utiliser quand des noms réservés ont été utilisés (pas bien ) comme noms d'objets (de table, de vue, de colonne...)

  6. #6
    Membre expert
    En fait, même avec les" dans la clause where, ça marche. Le bug était que l'utilisateur Pierre Durand n'existait pas ! Maintenant que je l'ai créé, ça marche
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  7. #7
    Rédacteur

    Citation Envoyé par laurentSc Voir le message
    En fait, même avec les" dans la clause where, ça marche. Le bug était que l'utilisateur Pierre Durand n'existait pas ! Maintenant que je l'ai créé, ça marche
    Jusqu'au jour ou ça marchera plus et que vous mettrez le système en panne pendant plusieurs jours avant de trouver votre erreur !

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  8. ###raw>post.musername###
    Membre actif
    Pour faire suite à SQLpro en un peu plus soft :
    • En SQL ANSI (le standard donc !), un string ne peut être encadré que par de simples quotes et d'ailleurs un administrateur SQL peut forcer MySQL à respecter ce standard (mode ANSI_QUOTE enabled). Donc du jour au lendemain votre code peut ne plus fonctionner si vous utilisez les doubles quotes!
    • La double quote est en général utilisée pour se simplifier la vie (euphémisme) pour pouvoir inclure une simple quote dans un string de cette manière :"J'aime (ou pas) MySQL"
    • En réalité il convient tout simplement d'utiliser l'échappement standard (\') pur ne délimiter les string qu'avec une simple quote tout en intégrant des simple quotes à l'intérieur du string
      1  0

  9. #9
    Expert éminent sénior
    Pour coder des simples quotes dans une chaîne de caractères, on peut également la coder en hexa

  10. #10
    Modérateur

    On peut aussi, conformément à la norme, doubler l'apostrophe dans la chaine : 'j''insère l''apostrophe'.
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

###raw>template_hook.ano_emploi###