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

SQL Oracle Discussion :

Comment désagréger une requête ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut Comment désagréger une requête ?
    Bonjour,

    J'ai une table A contenant entre autres les champs A1, A2 et A3

    Je voudrais que chacun de ces 3 champs aillent dans la colonne B1 de la table B.

    Donc une ligne de la table A va générer 3 lignes dans B (une pour chaque champ A1, A2 et A3.

    Je voudrais effectuer cette opération sans avoir à faire 3 insert:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Insert into B1(B_id, B1)
    select nom_sequence.nextval, A1
    from A;
     
    Insert into B1(B_id, B1)
    select nom_sequence.nextval, A2
    from A;
     
    Insert into B1(B_id, B1)
    select nom_sequence.nextval, A3
    from A;
    la solution suivante ne fonctionne pas car Oracle m'interdit d'appeler la même sequence dans un UNION:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Insert into B1(B_id, B1)
    select nom_sequence.nextval, A1
    from A
    UNION ALL
    select nom_sequence.nextval, A2
    from A
    UNION ALL
    select nom_sequence.nextval, A3
    from A;
    QQ'un a t'il une solution ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Essayez ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO B1(B_id, B1)
    SELECT
        nom_sequence.NEXTVAL,
        SR.B1
    FROM
    (
        SELECT A1 as B1 FROM A UNION ALL
        SELECT A2 FROM A UNION ALL
        SELECT A3 FROM A
    ) SR

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Pivot et multi-table insert
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    create table a (
      a1 varchar2(10),  
      a2 varchar2(10),
      a3 varchar2(10)
    )
    /
    insert into a
    values ('a1','a2','a3')
    /
    insert into a
    values ('a10','a20','a30')
    /
    create table b1 (
      b1 varchar2(10)
    )
    /
    mni@DIANA> insert First
      2  when rn = 1 then
      3    INTO B1 (B1) values (a1)
      4  when rn = 2  then
      5    INTO B1 (B1) values (a2)
      6  when rn=3  then
      7    INTO B1 (B1) values (a3)
      8  Select x.rn, a1, a2, a3
      9    from A, (Select level rn from dual connect by level <=3) x
     10  /
     
    6 ligne(s) créée(s).
     
    mni@DIANA> select * from B1
      2  ;
     
    B1
    ----------
    a1
    a10
    a2
    a20
    a3
    a30
     
    6 ligne(s) sélectionnée(s).

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    la technique de waldar marche mais je ne comprend pas celle de mnitu

  5. #5
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Les deux enregistrements de la table A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> SELECT a1, a2, a3
      2    FROM A
      3  /
     
    A1         A2         A3
    ---------- ---------- ----------
    a1         a2         a3
    a10        a20        a30
    sont multipliés par 3 via la sous-requête qui joue le rôle de la table pivot
    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
     
    SQL> SELECT x.rn, a1, a2, a3
      2    FROM A, (SELECT level rn FROM dual connect BY level <=3) x
      3  /
     
            RN A1         A2         A3
    ---------- ---------- ---------- ----------
             1 a1         a2         a3
             2 a1         a2         a3
             3 a1         a2         a3
             1 a10        a20        a30
             2 a10        a20        a30
             3 a10        a20        a30
     
    6 rows selected
    en ajoutant au passage un numéro d’ordre de l’enregistrement (colonne rn)

    Ensuite le « multi table insert » exploit ce numéro d’ordre (rn) pour décider de la colonne à insérer.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 750
    Par défaut
    ok merci !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment envoyer une requête POST via HTTP ?
    Par pdtor dans le forum C++
    Réponses: 2
    Dernier message: 13/09/2005, 05h54
  2. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  3. Comment grouper une requête par mois ?
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/06/2005, 12h01
  4. Comment traduire une requête en XPATH ?
    Par vincent1 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/06/2005, 12h46

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