J'ai deux tables T1 (Parent_Table) et T2 (Child_Table)
T1:
ID | File | ASSURANCE | VAL | 1 | L1 | ASSR1 | 0 | - Matched row from T1 for id=1 and lang=l1 1 | F1 | ASSR1 | 0 | - Matched row from T2 for id=1 and lang=l1 1 | F2 | ASSR1 | 4 | - Matched row from T2 for id=1 and lang=l1 1 | L2 | ASSR2 | 1 | - Matched row from T1 for id=1 and lang=l2 1 | F3 | ASSR2 | 8 | - Matched row from T2 for id=1 and lang=l2 1 | F4 | ASSR2 | 3 | - Matched row from T2 for id=1 and lang=l2 1 | L3 | ASSR3 | 5 | - Matched row from T1 for id=1 and lang=l3 1 | F5 | ASSR3 | 7 | - Matched row from T2 for id=1 and lang=l3 1 | F6 | ASSR3 | 0 | - Matched row from T2 for id=1 and lang=l3
T2:
ID | LANG | File | ASSURANCE | VAL | 1 | L1 | F1 | ASSR1 | 0 | 1 | L1 | F2 | ASSR1 | 4 | 1 | L2 | F3 | ASSR2 | 8 | 1 | L2 | F4 | ASSR2 | 3 | 1 | L3 | F5 | ASSR3 | 7 | 1 | L3 | F6 | ASSR3 | 0 |
Sortie attendue:
ID | LANG | ASSURANCE | VAL | 1 | L1 | ASSR1 | 0 | 1 | L2 | ASSR2 | 1 | 1 | L3 | ASSR3 | 5 |
Condition:
Je veux traverser T1 pour id = 1 et pour chaque langue, je veux d'abord sortir cette ligne (à partir de T1), puis traverse en T2 pour l'id et la langue actuelle et la liste des enregistrements correspondants dans T2 (pour l'id et la langue actuelle) puis continuez avec la langue suivante dans T1 jusqu'à ce que toutes les langues soient traitées dans T1.
Est-il possible d'y parvenir en utilisant une seule requête Oracle SQL?
Merci. p >
3 Réponses :
Quelque chose comme ça?
SQL> with t1 (id, lang, assurance, val) as
2 (select 1, 'L1', 'assr1', 0 from dual union all
3 select 1, 'L2', 'assr2', 1 from dual union all
4 select 1, 'L3', 'assr3', 5 from dual
5 ),
6 t2 (id, lang, cfile, assurance, val) as
7 (select 1, 'L1', 'F1', 'assr1', 0 from dual union all
8 select 1, 'L1', 'F2', 'assr1', 4 from dual union all
9 select 1, 'L2', 'F3', 'assr2', 8 from dual union all
10 select 1, 'L2', 'F4', 'assr2', 3 from dual union all
11 select 1, 'L3', 'F5', 'assr3', 7 from dual union all
12 select 1, 'L3', 'F6', 'assr3', 0 from dual
13 ),
14 inter as
15 (select t1.id, t1.lang, t1.lang cfile, t1.assurance, t1.val from t1
16 union all
17 select t2.id, t2.lang, t2.cfile, t2.assurance, t2.val from t2
18 )
19 select id, cfile, assurance, val
20 from inter
21 order by id, lang, cfile desc;
ID CF ASSUR VAL
---------- -- ----- ----------
1 L1 assr1 0
1 F2 assr1 4
1 F1 assr1 0
1 L2 assr2 1
1 F4 assr2 3
1 F3 assr2 8
1 L3 assr3 5
1 F6 assr3 0
1 F5 assr3 7
9 rows selected.
SQL>
Essayez ceci: sortie: p>
Collez les tableaux en utilisant union all , en ajoutant des informations sur la source des lignes. Pour le premier tableau, ajoutez également la colonne lang comme file_ . Enfin, triez cette union.
select id, file_, assurance, val
from (
select id, lang, lang file_, assurance, val, 't1' source from t1 where id = 1
union all
select id, lang, file_, assurance, val, 't2' source from t2 where id = 1)
order by lang, source, file_