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 :

Répéter une ligne N fois


Sujet :

SQL Oracle

  1. #1
    rs
    rs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 106
    Points : 96
    Points
    96
    Par défaut Répéter une ligne N fois
    Bonjour, supposons une requête qui renvoie trois colonnes

    varchar | varchar | number
    -------------------------
    a1 | b1 | n1
    a2 | b2 | n2
    ...

    je souhaiterais avoir en sortie : n1 lignes (a1,b1), n2 lignes (a2,b2), ...

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    éventuellement avec une clause MODEL
    (merci de toujours préciser ta version)

    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
     
    create table t as 
      select 'a1' a, 'b1' b, 2 n from dual union all 
      select 'a2','b2',5 from dual;
     
    select a,b,y||'/'||n 
    from t
    model
    partition by (a,b,n)
    dimension by(0 x)
    measures (n y) 
    rules upsert
    (
    y[for x from 1 to y[0]-1 increment 1]=cv(x)
    )
    order by a,b,y;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    A  B  R
    -- -- ----
    a1 b1 1/2
    a1 b1 2/2
    a2 b2 1/5
    a2 b2 2/5
    a2 b2 3/5
    a2 b2 4/5
    a2 b2 5/5

  3. #3
    rs
    rs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 106
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par laurentschneider
    (merci de toujours préciser ta version)
    effectivement désolé, c'est la 8.1.7

    j'ai trouvé que la clause MODEL est apparue avec la 10g... pas de chance pour le script

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    tu peux utiliser une table d'entiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    create table t as 
      select 'a1' a, 'b1' b, 2 n from dual union all 
      select 'a2','b2',5 from dual;
    create table r(r number primary key);
    exec for i in 1..10000 loop insert into r(r) values (i); end loop
    commit;
    il faut bien sûr mettre suffisament de lignes, ici 10'000. En fonction de ce que n peut être.

    ensuite c'est tout simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    select a,b,r,n
    from t,r
    where t.n>=r.r;
     
    A  B           R          N
    -- -- ---------- ----------
    a1 b1          1          2
    a1 b1          2          2
    a2 b2          1          5
    a2 b2          2          5
    a2 b2          3          5
    a2 b2          4          5
    a2 b2          5          5

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    plus élégant mais non-testé en 8i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create or replace type t_number as TABLE OF number;
    /
    create or replace function f_number(n number) return t_number pipelined is
    begin for i in 1..n loop pipe row(i); end loop; return; end;
    /
    create table t as 
      select 'a1' a, 'b1' b, 2 n from dual union all 
      select 'a2','b2',5 from dual;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select *
    from t,table(f_number(t.n));
    A  B           N COLUMN_VALUE
    -- -- ---------- ------------
    a1 b1          2            1
    a1 b1          2            2
    a2 b2          5            1
    a2 b2          5            2
    a2 b2          5            3
    a2 b2          5            4
    a2 b2          5            5

  6. #6
    rs
    rs est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 106
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par laurentschneider
    tu peux utiliser une table d'entiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select a,b,r,n
    from t,r
    where t.n>=r.r;
    le bon vieux produit cartésien

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

Discussions similaires

  1. Lire une ligne plusieurs fois
    Par xanix dans le forum Qt
    Réponses: 3
    Dernier message: 24/05/2010, 16h14
  2. Répéter une ligne sous condition
    Par gwirionez dans le forum SAS Base
    Réponses: 6
    Dernier message: 16/03/2010, 08h56
  3. Lire une ligne à la fois dans un tableau
    Par kenru dans le forum Langage
    Réponses: 11
    Dernier message: 22/12/2009, 16h52
  4. lire une table une ligne à la fois
    Par DEV-10 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 29/07/2009, 21h20
  5. Problème de débutant : Répéter une ligne
    Par Grelot dans le forum Access
    Réponses: 5
    Dernier message: 05/06/2007, 13h55

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