我有两个表T1(Parent_Table)和T2(Child_Table)
T1:
ID | LANG | ASSURANCE | VAL |
1 | L1 | ASSR1 | 0 |
1 | L2 | ASSR2 | 1 |
1 | L3 | ASSR3 | 5 |
Taq酶:
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 |
预期产量:
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
需求:
我想通过T1遍历id = 1并且对于每个lang,我想首先输出该行(来自T1)然后在T2中遍历id和当前lang以及T2中的匹配记录列表(用于id和current) lang)然后继续T1中的下一个lang直到所有langs都在T1处理。
是否可以使用单个Oracle SQL查询来实现它?
谢谢。
试试这个:
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
使用union all
粘贴表格,添加有关行源的信息。对于第一个表,还将列lang
添加为file_
。最后排序这个联盟。
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_
像这样的东西?
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>