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 :

Plusieurs select dans un INSERT


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut Plusieurs select dans un INSERT
    Bonjour,

    je suis novice en SQL et je me demande s'il est possible de faire un INSERT sur une table avec plusieurs SELECT sur une même variable.
    J'ai été voir sur l'aide de votre forum mais n'arrive pas à l'adapter à mon problème. Il faut que je modifie la clause where de chaque SELECT.

    Mon code risque d'être plus parlant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    insert into BU ("code_bu","nom_bu","statut_qdb_bu","date_statut_qdb_bu","type_qdb_bu","flag_archive_bu")
      (SELECT "string_value"
      FROM alf_node_properties where qname_id='1542',
      SELECT "string_value"
      FROM alf_node_properties where qname_id='1545',
      SELECT "string_value"
      FROM alf_node_properties where qname_id='1546',
      SELECT "string_value"
      FROM alf_node_properties where qname_id='1543',
      SELECT "string_value"
      FROM alf_node_properties where qname_id='1541',
      SELECT "string_value"
      FROM alf_node_properties where qname_id='1544'
      )
    J'ai une erreur qui est retourné sur la "," après le premier select.
    Chaque select possède le même nombre de ligne.

    Je vous remercie d'avance pour l'attention que vous porterez à mon problème,
    Mickaël.

  2. #2
    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
    Quel est votre SGBD ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Bonjour Waldar,

    postgreSQL

  4. #4
    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
    Essayez comme-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO BU ("code_bu","nom_bu","statut_qdb_bu","date_statut_qdb_bu","type_qdb_bu","flag_archive_bu")
    SELECT
      (SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1542'),
      (SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1545'),
      (SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1546'),
      (SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1543'),
      (SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1541'),
      (SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1544');
    Ou comme-ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO BU ("code_bu","nom_bu","statut_qdb_bu","date_statut_qdb_bu","type_qdb_bu","flag_archive_bu")
    VALUES (
      SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1542',
      SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1545',
      SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1546',
      SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1543',
      SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1541',
      SELECT "string_value" FROM alf_node_properties WHERE qname_id = '1544'
           );

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Pour la première solution, j'ai une erreur "ERROR: more than one row returned by a subquery used as an expression".

    Pourtant je ne sélectionne qu'une variable par requête.

    Pour la deuxième, il me retourne une erreur sur le select après le VALUES.

  6. #6
    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
    Que donne cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
      FROM alf_node_properties
     WHERE qname_id between '1541' and '1546';

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Elle me renvoie 972 lignes, 6*162 lignes, ce qui correspond au 162 lignes par qname_id, pour une 10ene de colonne
    J'ai édité ma précédente réponse pour ta deuxième solution.

  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
    Ah oui c'est normal, ces syntaxes (insert into values ou requête scalaire) ne gèrent qu'une valeur à la fois par sous-requête.

    Vous voulez insérer les 162 lignes c'est bien ça ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Oui, c'est cela

  10. #10
    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
    Quelle est la structure de votre table alf_node_properties ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    La structure était déja définit comme cela :
    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
    CREATE TABLE alf_node_properties
    (
      node_id bigint NOT NULL,
      actual_type_n integer NOT NULL,
      persisted_type_n integer NOT NULL,
      boolean_value boolean,
      long_value bigint,
      float_value real,
      double_value double precision,
      string_value character varying(1024),
      serializable_value bytea,
      qname_id bigint NOT NULL,
      list_index integer NOT NULL,
      locale_id bigint NOT NULL,
      CONSTRAINT alf_node_properties_pkey PRIMARY KEY (node_id, qname_id, list_index, locale_id),
      CONSTRAINT fk_alf_nprop_loc FOREIGN KEY (locale_id)
          REFERENCES alf_locale (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION,
      CONSTRAINT fk_alf_nprop_n FOREIGN KEY (node_id)
          REFERENCES alf_node (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION,
      CONSTRAINT fk_alf_nprop_qn FOREIGN KEY (qname_id)
          REFERENCES alf_qname (id) MATCH SIMPLE
          ON UPDATE NO ACTION ON DELETE NO ACTION
    )
    WITH (OIDS=FALSE);
    ALTER TABLE alf_node_properties OWNER TO alfresco;

  12. #12
    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
    Est-ce qu'il y a une donnée commune aux 6*162 lignes ?
    J'espérais en trouver une dans le script de la table, mais non il y a trop de colonnes.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    On peut séparer le jeu de donnée en 6 par le qname_id si j'ai bien compris votre question

  14. #14
    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
    Non ce n'était pas tout à fait ça, pour la répartition en six ce sont les qname_id.
    Plutôt pour la répartition des 162 lignes, est-ce qu'une donnée commune se retrouve sur ces 162 lignes ?

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    t_id   q_id    q_cd
    1      1       A
    2      1       B
    3      1       C
    4      2       A
    5      2       B
    6      2       C
    Ici la colonne q_cd permet de regrouper les trois lignes pour les deux q_id différents.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2009
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    non, aucune donnée en commun

  16. #16
    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
    Ok, j'espère que vous utilisez un PostgreSQL récent !

    Essayez ainsi :
    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
    INSERT INTO BU ("code_bu","nom_bu","statut_qdb_bu","date_statut_qdb_bu","type_qdb_bu","flag_archive_bu")
    With SR as
    (
    SELECT qname_id, "string_value", 
           row_number() over(partition by qname_id order by qname_id asc) as rn
      FROM alf_node_properties
     WHERE qname_id BETWEEN '1541' AND '1546'
    )
      SELECT max(case qname_id when '1542' then "string_value" end),
             max(case qname_id when '1545' then "string_value" end),
             max(case qname_id when '1546' then "string_value" end),
             max(case qname_id when '1543' then "string_value" end),
             max(case qname_id when '1541' then "string_value" end),
             max(case qname_id when '1544' then "string_value" end)
        FROM SR
    GROUP BY rn;

Discussions similaires

  1. SELECT dans un INSERT
    Par todier dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/04/2007, 15h44
  2. Insérer plusieurs valeurs dans rq INSERT
    Par Guennec.Yannick dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2007, 12h52
  3. [SQL] SELECT dans un INSERT
    Par macben dans le forum Oracle
    Réponses: 3
    Dernier message: 28/12/2005, 09h40
  4. [ASE]probleme memoire: select dans une insert
    Par SegmentationFault dans le forum Sybase
    Réponses: 2
    Dernier message: 16/08/2005, 12h20
  5. Plusieurs SELECT dans l'ouverture d'une connection
    Par pmboutteau dans le forum ASP
    Réponses: 6
    Dernier message: 01/04/2005, 11h09

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