Как захватить оригинальный идентификатор «Начать с» в виде столбца в запросе Oracle SQL LEVEL - PullRequest
0 голосов
/ 01 марта 2019

Работа с большой базой данных материалов, используемых в качестве «входов» для создания различных «выходов» в течение нескольких поколений.Конечный результат (продукт для рынка) может потенциально иметь более десятка поколений входов в своей истории.Каждый из этих входов имеет свою собственную запись.

В настоящее время я создаю нисходящий вид этой генеалогии (имеется в виду, начиная с конечного продукта и обратно через все входы), используя LEVEL.

Упрощенный / концептуальный пример кода следующим образом:

SELECT
 OL.LOT_NAME AS output_id,
 IL.LOT_NAME AS input_id,
 LEVEL
FROM GENEALOGY_TABLE G
INNER JOIN LOT_TABLE OL
 on G.OUTPUT_LOT_KEY = OL.LOT_KEY
INNER JOIN LOT_TABLE IL
 on G.INPUT_LOT_KEY = IL.LOT_KEY
START WITH OL.LOT_NAME IN ('X', 'Y', etc...)
CONNECT BY NOCYCLE PRIOR IL.LOT_NAME = OL.LOT_NAME
ORDER BY LEVEL

Я хочу добавить еще один столбец к этой выходной таблице, который содержит исходное значение «START WITH», которое является источникомлюбая данная запись.Это означает, что даже если запись имеет уровень 10, я не только увижу вывод уровня 9, созданный этим материалом, но и какой из множества конечных продуктов («X», «Y» и т. Д. В приведенном выше примере).пример), который в конечном итоге был создан в нисходящем направлении.

Есть ли в Oracle функция, способная справиться с этим?Есть ли простой трюк для этого я скучаю?Любые предложения будут замечательными.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы можете использовать оператор connect_by_root :

SELECT
 OL.LOT_NAME AS output_id,
 IL.LOT_NAME AS input_id,
 LEVEL,
 CONNECT_BY_ROOT(OL.LOT_NAME) AS STARTED_WITH
FROM GENEALOGY_TABLE G
...

Быстрая демонстрация с использованием таблиц HR-схемы:

SELECT employee_id, last_name, manager_id, connect_by_root(manager_id)
FROM employees
START WITH manager_id in (101, 102)
CONNECT BY PRIOR employee_id = manager_id;

EMPLOYEE_ID LAST_NAME                 MANAGER_ID CONNECT_BY_ROOT(MANAGER_ID)
----------- ------------------------- ---------- ---------------------------
        108 Greenberg                        101                         101
        109 Faviet                           108                         101
        110 Chen                             108                         101
        111 Sciarra                          108                         101
        112 Urman                            108                         101
        113 Popp                             108                         101
        200 Whalen                           101                         101
        203 Mavris                           101                         101
        204 Baer                             101                         101
        205 Higgins                          101                         101
        206 Gietz                            205                         101
        103 Hunold                           102                         102
        104 Ernst                            103                         102
        105 Austin                           103                         102
        106 Pataballa                        103                         102
        107 Lorentz                          103                         102

16 rows selected. 
0 голосов
/ 01 марта 2019

С Oracle всегда есть выход.Используйте CONNECT_BY_ROOT .

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