Oracle SQL - перечисление записей из родительской и дочерней таблиц в определенном порядке - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть две таблицы 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 и для каждого языка, я хочу сначала вывести эту строку (из T1), а затем пройти в T2 для идентификатора и токаlang и список совпадающих записей в T2 (для идентификатора и текущего lang) затем переходят к следующему lang в T1, пока все lang не будут обработаны в T1.

Возможно ли достичь этого с помощью одного Oracle SQLзапрос?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Попробуйте:

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
0 голосов
/ 14 февраля 2019

Склейте таблицы, используя 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

0 голосов
/ 14 февраля 2019

Как то так?

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...