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
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
é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
Envoyé par laurentschneider
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
tu peux utiliser une table d'entiers.
il faut bien sûr mettre suffisament de lignes, ici 10'000. En fonction de ce que n peut être.
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;
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
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
Envoyé par laurentschneider
le bon vieux produit cartésien
![]()
Partager