簡體   English   中英

Oracle SQL-按特定順序列出父子表中的記錄

[英]Oracle SQL - Listing records from Parent and Child Table in a certain order

我有兩個表T1(Parent_Table)和T2(Child_Table)

T1:

ID | LANG | ASSURANCE | VAL |
 1 |  L1  |   ASSR1   |  0  |
 1 |  L2  |   ASSR2   |  1  |
 1 |  L3  |   ASSR3   |  5  |

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  |

預期輸出:

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,直到在T1中處理了所有lang。

是否可以使用單個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_

dbfiddle演示

像這樣嗎

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM