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 :

Simplification d'un INSERT INTO


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut Simplification d'un INSERT INTO
    Bonjour,
    j'aimerais simplifier cette requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO 'matable'
    ('module', 'produit', 'nom')
    VALUES ('991', '1', 'toto'), ('992', '2', 'toto'), ('993', '3', 'toto') etc ... ;
    sachant qu'il y a 1000 produit auquels je dois ajouter le nom 'toto' et que les modules doivent etre incrémenter de 1000 à 2000.

    Information supplémentaire :

    de plus la 2eme valeur est le resultat de cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT produit FROM 'matable' WHERE 1
    ça serait cool de l'ajouter comme ça à la place de 1 2 3 4 5 etc ...

    quant à la 1ere valeur ça doit se mettre à la suite de mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT MAX(module) FROM 'matable'

  2. #2
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Après avoir fais le tour des cours ...je ne trouve rien

    Peut etre est-ce impossible??

  3. #3
    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
    Bonjour,

    Si tu es sous Oracle, tu peux utiliser CONNECT BY.
    Sinon, tu peux le faire par script.

  4. #4
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    c du mysql.

    y'a pas une requete permettant de le fire?
    qu'entend tu par script?
    je prgm en php

  5. #5
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Euh... tu insères dans la table 'matable' une valeur pour la colonne 'produit' qui elle-même vient de la même table 'matable' ? !
    Idem pour la colonne 'module' qui doit contenir le MAX de cette même colonne ?

    J'ai l'impression qu'en voulant simplifier ton cas réel, tu nous as donné des informations fausses. Donne-nous ton cas réel ce sera plus simple. Ca m'étonnerait que la table à alimenter s'appelle 'matable', ainsi que les deux autres.

    Bref, respecte les règles du forum en nous donnant la structure de tes tables.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Bonjour,
    si c'est bien la meme table.

    matable :

    module_id produit_id nom_tache

    le module_id est unique
    le produit_id peut appartenir à plusieurs module_id
    le nom_tache peut appartenir à plusieurs produit_id

    le but étant pour chaque produit_id d'avoir un nouveau nom_tache.
    Pour cela il faudrait créer autant de module_id que de produit_id ayant pour nom-tache le nom voulu.

    c'est pour cela que j'ai :
    SELECT DISTINCT produit_id FROM 'matable' WHERE 1
    pour selectionner tout les produit_id une seule fois

    et donc cette requete fonctionne :
    INSERT INTO 'matable'
    ('module_id', 'produit_id', 'nom_tache')
    VALUES ('991', '1', 'toto'), ('992', '2', 'toto'), ('993', '3', 'toto') etc ... ;
    mais si j'ai 1000 produit_id c'est trop long...

    dans mes values,
    la premiere valeur est le max de mon module_id incrémenté
    la 2eme valeur est
    SELECT DISTINCT produit_id FROM 'matable' WHERE 1
    incrémenté à chaque fois
    et la troisème est un nom identique à chaque fois.

    j'espere avoir été clair et que c'est possible ... en moins de 1002 lignes ...

  7. #7
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par dodo91 Voir le message
    Bonjour,
    si c'est bien la meme table.

    matable :

    module_id produit_id nom_tache

    le module_id est unique
    le produit_id peut appartenir à plusieurs module_id
    le nom_tache peut appartenir à plusieurs produit_id

    le but étant pour chaque produit_id d'avoir un nouveau nom_tache.
    Soit tu ne nous dis pas tout (il y a d'autres tables et par exemple id_produit est une clé étrangère), soit si tu n'as vraiment qu'une seule table il y a une grosse erreur de conception ! Un SGBD n'est pas un tableur !
    En tout cas ton besoin n'est toujours pas clair pour moi désolé.

    Et quand on demande la structure de la table, c'est par exemple (sous MySQL) le résultat de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHOW CREATE TABLE matable
    On obtient ainsi la structure complète avec les types des colonnes, l'éventuelle auto-incrémentation de l'une d'elles (module_id peut-être ?), la définition de la clé primaire (module_id encore ou le couple module_id + produit_id ?) et des éventuelles clés étrangères (produit_id ? module_id ?) pour autant que ces dernières aient été implémentées, ce qui n'est pas possible en MySQl avec le moteur MyISAM.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    les autres tables n'interviennent pas dans mon problème mais je vais les mettre pour clarifié les choses :

    table prod_in_site avec :
    ProdInSite_id information
    1 info1
    2 info2
    3 info3
    4 info4...
    prodInSIte_id s'auto-incrémente

    table mod_in_site avec :
    ModInSite_id prodInSite_id nom_module
    1 1 module1
    2 1 module2
    3 2 module2
    4 2 module5
    un modInSite à plusieurs prodInSite.
    ModInSite_id s'auto-incrémente.

    table nom_module avec :
    nom_module
    module1
    module2
    module3
    module4
    nom_module s'auto-incrémente.

    1ere etape : j'ai créer un nom_module = module999

    mon but est d'ajouter un nouveau nom_module (module999) à tout les mod_in_site.
    Pour cela tout les prod_in_site doivent avoir le module999.
    un prod_in_site a une liste de nom_module à laquelle je veux ajouter à tous "module999".

    j'espere avoir été clair ...
    s'il manque des infos je suis la

    Merci de répondre en tt cas.

  9. #9
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Au lieu d'une table nom_module, tu devrais avoir la table :
    Module(module_id, module_nom)
    Parce que répéter pour 1000 produits le nom du module, c'est de la redondance de données, c'est risqué et pas performant pour les recherches.

    mon but est d'ajouter un nouveau nom_module (module999) à tout les mod_in_site.
    Pour cela tout les prod_in_site doivent avoir le module999.
    un prod_in_site a une liste de nom_module à laquelle je veux ajouter à tous "module999".

    j'espere avoir été clair ...
    Pas encore tout à fait...
    Je reprends la structure de 'matable' (dont tu ne veux toujours pas nous donner la définition exacte ! ) :
    module_id produit_id nom_tache
    Ce que je comprends, c'est que tu veux insérer dans cette table la tâche 'toto' pour tous les modules_id venant de la table 'mod_in_site' (colonne 'ModInSite_id') ?

    Comme il y a déjà une association avec le produit dans la table 'mod_in_site', pourquoi la répéter dans 'matable' ?

    Sinon la requête qui devrait répondre au besoin ci-dessus est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO matable(module_id, produit_id, nom_tache)
    SELECT ModInSite_id, ProdInSite_id, 'toto'
    FROM mod_in_site

  10. #10
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    Au lieu d'une table nom_module, tu devrais avoir la table :
    Module(module_id, module_nom)
    Parce que répéter pour 1000 produits le nom du module, c'est de la redondance de données, c'est risqué et pas performant pour les recherches.
    je suis d'accord malheureusement je ne peut pas toucher aux tables existante ...
    il y a bel et bien :
    une table nom_module où tout les nom sont répertoriés
    une table prod_in_site où les produit sont repertorié
    une table module_in_site où sont répertorié les combinaisons "nom_module/prod_in_site"
    dans cette table il y a donc beaucoup beacoup de ligne ...

    Pas encore tout à fait...
    Je reprends la structure de 'matable' (dont tu ne veux toujours pas nous donner la définition exacte ! ) :
    c'est la table module_in_site
    Ce que je comprends, c'est que tu veux insérer dans cette table la tâche 'toto' pour tous les modules_id venant de la table 'mod_in_site' (colonne 'ModInSite_id') ?
    presque, je veux inséré le nom_module 'toto' à chaque prod_in_site différent d'où mon select distinct pour ne les voir qu'une fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT prodInSite_id FROM 'module_in_site' WHERE 1
    exemple :
    ma requete me retourne :
    prodInSite_id
    1
    2
    3

    je voudrais donc ajouter :
    moduleInSite_id ProdInSite nom_tache
    max+1 1 toto
    max+2 2 toto
    max+3 3 toto

  11. #11
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    module_id n'est-il pas la clé primaire de la table ? de type entier auto-incrémenté ?
    Si c'est le cas inutile de lui donner une valeur, ça se fera tout seul. Si ce n'est pas le cas, il y a encore semble t-il une erreur de conception !

    Autre question : Tu ne veux que les prodinSite_id qui sont dans module_in_site ou tous les ProdInSite_id qui sont dans prod_in_site ?

  12. #12
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    si si c'est la clé primaire auto-incrémenter.

    Citation:
    table mod_in_site avec :
    ModInSite_id prodInSite_id nom_module
    1 1 module1
    2 1 module2
    3 2 module2
    4 2 module5
    un modInSite à plusieurs prodInSite.
    ModInSite_id s'auto-incrémente.

    Autre question : Tu ne veux que les prodinSite_id qui sont dans module_in_site ou tous les ProdInSite_id qui sont dans prod_in_site ?
    Je veux tout les prod_in_site_id DIFFERENT qui sont dans module_in_site.
    Cela revient à tous les prodInSite_id de prod_in_site

  13. #13
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Dans ce cas c'est on ne peut plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO matable(produit_id, nom_tache)
    SELECT DISTINCT ProdInSite_id, 'toto'
    FROM prod_in_site
    module_id va s'alimenter tout seul !

  14. #14
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    ça serait trop simple lol

    INSERT INTO matable(produit_id, nom_tache)
    SELECT DISTINCT ProdInSite_id, 'toto'
    FROM prod_in_site
    deja je le modifie pour avoir ce que je veux :

    INSERT INTO 'module_in_site' (prodInSite_id, nom_module)
    SELECT DISTINCT ProdInSite_id, 'module999'
    FROM 'prod_in_site'
    et malheureusement ça ne marche pas.

    De plus mon nom_module = module999 est la clé primaire c'est comme un id

    rappel des tables :


    Citation:
    table prod_in_site avec :
    ProdInSite_id information
    1 info1
    2 info2
    3 info3
    4 info4...
    prodInSIte_id s'auto-incrémente

    Citation:
    table mod_in_site avec :
    ModInSite_id prodInSite_id nom_module
    1 1 module1
    2 1 module2
    3 2 module2
    4 2 module5
    un modInSite à plusieurs prodInSite.
    ModInSite_id s'auto-incrémente.

    Citation:
    table nom_module avec :
    nom_module
    module1
    module2
    module3
    module4
    nom_module s'auto-incrémente.

  15. #15
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par dodo91 Voir le message
    et malheureusement ça ne marche pas.
    Qu'est-ce qui ne marche pas ?

    De plus mon nom_module = module999 est la clé primaire c'est comme un id
    C'est apparemment la clé primaire de la table 'nom_module' mais pas celle de la table 'module_in_site' donc je ne vois pas le problème !

  16. #16
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    143
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 143
    Points : 52
    Points
    52
    Par défaut
    INSERT INTO 'module_in_site' (prodInSite_id, nom_module)
    SELECT DISTINCT ProdInSite_id, 'module999'
    FROM 'prod_in_site'
    revient à inserer dans la table 'module_in_site',
    à l'endroit des valeur prodInSite_id et nom_module
    les champs distincts de la table 'prod_in_site' où ProdInSite_id et 'module999' sont présent.

    ce que je veu c'est ajouter à la table module_in_site,
    plein de ligne :

    nouvel exemple:
    ModuleInSite_id ProdInSite_id nom_module
    1 1 snickers
    2 1 kitkat
    3 1 twix
    4 2 kitkat
    5 2 kinder
    6 3 twix
    7 3 kinder

    etc .....

    et je veu rajouter "café" à chaque prodInSite

    ModuleInSite_id ProdInSite_id nom_module
    1001 1 café
    1002 2 café
    1003 3 café
    1004 4 café
    1005 5 café
    il y a peu etre un malentendu, nom_module n'est pas dans la table module_in_site !!!

    il existe une table module_in_site qui contient moduleInSite_id et une table module qui contient nom_module

  17. #17
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par dodo91 Voir le message
    revient à inserer dans la table 'module_in_site',
    à l'endroit des valeur prodInSite_id et nom_module
    les champs distincts de la table 'prod_in_site' où ProdInSite_id et 'module999' sont présent.
    Non !
    On insère dans la colonne nom_module de la table module_in_site la valeur 'module999' et toutes les lignes insérées auront la même valeur pour cette colonne. Si tu veux ajouter 'café' tu remplaces 'module999' par 'café' dans la requête et elle devrait bien t'ajouter pour tous les produits de la table 'prod_in_site' la valeur 'café' à la colonne 'nom_module'. La valeur de ModuleInSite_id étant auto-incrémentée, elle se remplira toute seule, on n'a pas besoin de donner les valeurs.

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/10/2006, 14h28
  2. probleme clé sequentiel avec insert into
    Par shake dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/06/2004, 15h54
  3. probleme d'INSERT INTO et JavaScript
    Par Matlight dans le forum Langage SQL
    Réponses: 3
    Dernier message: 04/03/2004, 15h36
  4. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 11h38
  5. Insert Into + Date
    Par BoeufBrocoli dans le forum SQL
    Réponses: 10
    Dernier message: 13/08/2003, 11h23

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