SQL - получить родительские значения - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть следующая таблица:

TABLE1

FILE_NAME       C_TYPE          H_LEVEL     HOOP    ELEMENT_ID  ELEMENT_VAL  LINE_NUM   
text1.txt       74774592        Header      2000    DTP01-01    472          42
text1.txt       74774592        Header      2000    DTP02-01    34567        42
text1.txt       74774592        Header      2000    DTP03-01    RET          42
text1.txt       74774592        Header      2000    DTP01-01    473          58
text1.txt       74774592        Header      2000    DTP02-01    7567         58
text1.txt       74774592        Header      2000    DTP03-01    QET          58
text2.txt       74774592        Header      2000    CR01-01     33           42
text2.txt       74774592        Header      2000    CR02-01     TYES         42
text2.txt       74774592        Header      2000    CR03-01     VBFG         42
text2.txt       74774592        Header      2000    CR01-01     65           58
text2.txt       74774592        Header      2000    CR02-01     RET          58
text2.txt       74774592        Header      2000    CR03-01     QQQ          58

Ниже приведена таблица вывода:

TABLE2

FILE_NAME       C_TYPE          H_LEVEL     HOOP    ELEMENT_ID  ELEMENT_VAL  LINE_NUM   PARENT_ELEMENT_ID   PARENT_EMENT_VAL
text1.txt       74774592        Header      2000    DTP01-01    472          42         DTP01-01            472
text1.txt       74774592        Header      2000    DTP02-01    34567        42         DTP01-01            472
text1.txt       74774592        Header      2000    DTP03-01    RET          42         DTP01-01            472
text1.txt       74774592        Header      2000    DTP01-01    473          58         DTP01-01            473
text1.txt       74774592        Header      2000    DTP02-01    7567         58         DTP01-01            473
text1.txt       74774592        Header      2000    DTP03-01    QET          58         DTP01-01            473
text2.txt       74774592        Header      2000    CR01-01     33           42         CR01-01             33
text2.txt       74774592        Header      2000    CR02-01     TYES         42         CR01-01             33
text2.txt       74774592        Header      2000    CR03-01     VBFG         42         CR01-01             33
text2.txt       74774592        Header      2000    CR01-01     65           58         CR01-01             65
text2.txt       74774592        Header      2000    CR02-01     RET          58         CR01-01             65
text2.txt       74774592        Header      2000    CR03-01     QQQ          58         CR01-01             65

Выходная таблица должна содержать 2 дополнительных столбца:

  • PARENT_ELEMENT_ID
  • PARENT_ELEMENT_VAL

PARENT_ELEMENT_ID и PARENT_ELEMENT_VAL являются первыми ELEMENT_ID формата (% 01-01) FILE_NAME и LINE_NUM.

Итак, напр. первая строка в Таблице 1 имеет идентификатор элемента DTP01-01, который соответствует формату% 01-01, поэтому этот идентификатор элемента будет добавлен как PARENT_ELEMENT_ID, а элемент_val DTP01-01 станет PARENT_ELEMENT_VAL будет добавлен ко всем строкам с одинаковым именем файла и line_num.

Я не могу найти первый элемент и не уверен, как добавить его в виде 2 столбцов.

Как мне добиться этого с помощью SQL?

1 Ответ

1 голос
/ 26 апреля 2019

Что-то вроде этого?

Я сократил список столбцов, удалив столбцы, которые не имеют значения, так как вы не предоставили CREATE TABLE & INSERT INTO операторов (и мне не хотелось печатать так много).Также я бы сказал, что вы допустили ошибку в желаемом выводе - откуда вы взяли ELEMENT_VAL = 473?Там нет ничего в исходных данных.

SQL> with test (file_name, element_id, element_val, line_num) as
  2    (select 'text1.txt', 'DTP01-01', '472'  , 42 from dual union all
  3     select 'text1.txt', 'DTP02-01', '34567', 42 from dual union all
  4     select 'text1.txt', 'DTP03-01', 'RET'  , 42 from dual union all
  5     select 'text1.txt', 'DTP01-01', '472'  , 58 from dual union all
  6     select 'text1.txt', 'DTP02-01', '7567' , 58 from dual union all
  7     select 'text1.txt', 'DTP03-01', 'QET'  , 58 from dual union all
  8     --
  9     select 'text2.txt', 'CR01-01', '33'  , 42 from dual union all
 10     select 'text2.txt', 'CR02-01', 'TYES', 42 from dual union all
 11     select 'text2.txt', 'CR03-01', 'VBFG', 42 from dual union all
 12     select 'text2.txt', 'CR01-01', '65'  , 58 from dual union all
 13     select 'text2.txt', 'CR02-01', 'RET' , 58 from dual union all
 14     select 'text2.txt', 'CR03-01', 'QQQ' , 58 from dual
 15    ),
 16  src as
 17    (select file_name, line_num, element_id, element_val
 18     from test
 19     where instr(element_id, '01-01') > 0
 20    )
 21  select t.file_name, t.element_id, t.element_val, t.line_num,
 22    s.element_id parent_element_id,
 23    s.element_val parent_element_val
 24  from test t join src s on s.file_name = t.file_name
 25                        and s.line_num = t.line_num
 26  order by t.file_name, t.line_num, t.element_id;

FILE_NAME ELEMENT_ ELEME   LINE_NUM PARENT_E PAREN
--------- -------- ----- ---------- -------- -----
text1.txt DTP01-01 472           42 DTP01-01 472
text1.txt DTP02-01 34567         42 DTP01-01 472
text1.txt DTP03-01 RET           42 DTP01-01 472
text1.txt DTP01-01 472           58 DTP01-01 472
text1.txt DTP02-01 7567          58 DTP01-01 472
text1.txt DTP03-01 QET           58 DTP01-01 472
text2.txt CR01-01  33            42 CR01-01  33
text2.txt CR02-01  TYES          42 CR01-01  33
text2.txt CR03-01  VBFG          42 CR01-01  33
text2.txt CR01-01  65            58 CR01-01  65
text2.txt CR02-01  RET           58 CR01-01  65
text2.txt CR03-01  QQQ           58 CR01-01  65

12 rows selected.

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...