Попробуйте:
with
T1 as (
select 1 as id, 'L1' as LANG, 'ASSR1' as assurance, 0 as VAL from dual union
select 1, 'L2', 'ASSR2',1 from dual union
select 1, 'L3','ASSR3',5 from dual),
T2 as (
select 1 as id , 'L1' as lang, 'F1' as "FILE", 'ASSR1' as assurance, 0 as val from dual union
select 1,'L1','F2','ASSR1',4 from dual union
select 1,'L2','F3','ASSR2',8 from dual union
select 1,'L2','F4','ASSR2',3 from dual union
select 1,'L3','F5','ASSR3',7 from dual union
select 1,'L3','F6','ASSR3',0 from dual),
T3 as (select t2.id, t2.lang, t2."FILE", t2.assurance, t2.val, row_number() over (partition by t2.id, t2.lang order by t2."FILE") as pos
from T2
inner join t1 on t1.id = t2.id and t1.lang = t2.lang)
select t1.id, t1.lang, t1.lang as "FILE", t1.assurance, t1.val, 0 as pos from T1
union
select t3.id, t3.lang, t3."FILE", t3.assurance, t3.val, t3.pos
from t3
order by id,lang,pos
Вывод:
ID LANG FILE ASSURANCE VAL POS
1 L1 L1 ASSR1 0 0
1 L1 F1 ASSR1 0 1
1 L1 F2 ASSR1 4 2
1 L2 L2 ASSR2 1 0
1 L2 F3 ASSR2 8 1
1 L2 F4 ASSR2 3 2
1 L3 L3 ASSR3 5 0
1 L3 F5 ASSR3 7 1
1 L3 F6 ASSR3 0 2