У меня есть модель данных (в netezza), которая имеет несколько таблиц (PROCESS_DEFINITION и PROCESS_HIERARCHY). Ниже приведена структура:
PROCESS_DEFINITION
+------------+------------------+-------------------------+
| PROCESS_SK | PROCESS_CATEGORY | PROCESS_CATEGORY_VAL |
+------------+------------------+-------------------------+
| 1 | ROOT_PROCESS | ROOT |
| 2 | FREQUENCY | WEEKLY |
| 3 | FREQUENCY | DAILY |
| 4 | ACTIVITY | EMPLOYEE CHECKIN |
| 5 | ACTIVITY | EMPLOYEE CHECKIN REPORT |
PROCESS_HIERARCHY
+--------------+------------+-------------------+------------------+-------------------------------+
| HIERARCHY_SK | PROCESS_SK | PARENT_PROCESS_SK | CHILD_PROCESS_SK | PARENT_HIERARCHY_ARRAY |
+--------------+------------+-------------------+------------------+-------------------------------+
| 1 | 1 | NULL | 2 | NULL |
| 2 | 1 | NULL | 3 | NULL |
| 3 | 2 | 1 | 5 | 1 |
| 4 | 3 | 1 | 4 | 1 |
| 5 | 4 | 3 | NULL | 1|3 |
| 6 | 5 | 2 | NULL | 1|2 |
Таким образом, иерархия выглядит следующим образом:
ROOT
-Daily
- EMPLOYEE CHECKIN
-WEEKLY
- ОТЧЕТ РАБОТНИКА
Тогда у меня вопрос, как мне взять мой столбец "PARENT_ARRAY" со значениями "1 | 3" и "1 | 2" и, по сути, "поиск" в моей таблице PROCESS_DEFINITION, чтобы получить связанный PROCESS_CATEGORY_VAL, чтобы мой вывод выглядел как следующее, а также учет n количества массивов. В моем простом примере в массиве было только два индекса. Но мне нужен программный способ итерации по n числу индексов и получения соответствующего значения из PROCESS_DEFINITION.
+--------------+-------------------------+-------------------+-------------------------+------------------------+
| HIERARCHY_SK | CURRENT_PROCESS | PARENT_PROCESS | CHILD_PROCESS | PARENT_HIERARCHY_ARRAY |
+--------------+-------------------------+-------------------+-------------------------+------------------------+
| 1 | ROOT | NULL | WEEKLY | NULL |
| 2 | ROOT | NULL | DAILY | NULL |
| 3 | WEEKLY | ROOT | EMPLOYEE CHECKIN REPORT | ROOT |
| 4 | DAILY | ROOT | EMPLOYEE CHECKIN | ROOT |
| 5 | EMPLOYEE CHECKIN | DAILY | NULL | ROOT|DAILY |
| 6 | EMPLOYEE CHECKIN REPORT | WEEKLY | NULL | ROOT|WEEKLY |
Я попытался использовать комбинацию array_count, array_split, get_value_varchar и case-операторов в netezza, и я не могу понять это.
Я не думаю, что могу использовать операторы case, потому что число родительских иерархий вплоть до ROOT неизвестно (n количество иерархий). И поскольку это не объектно-ориентированное программирование, я не знаю, как «перебрать» каждое значение массива и заменить PARENT_PROCESS_SK на ассоциированное значение.
Вот SQL, который я написал для получения всего, кроме PARENT_ARRAY "преобразование"
WITH BASE_PROCESS AS (
SELECT HIER.HIERARCHY_SK, DEF.PROCESS_CATEGORY_VAL AS CURRENT_PROCESS, HIER.PARENT_HIERARCHY_ARRAY
FROM PROCESS_HIERARCHY HIER, PROCESS_DEFINITION DEF
WHERE HIER.GROUP_SK = DEF.PROCESS_GROUP_SK
AND HIER.PROCESS_SK = DEF.PROCESS_SK
AND HIER.PROCESS_SK in (4,5))
, PARENT_PROCESS AS (
SELECT HIER.HIERARCHY_SK, DEF.PROCESS_CATEGORY_VAL AS PARENT_PROCESS, PARENT_HIERARCHY_ARRAY
FROM PROCESS_HIERARCHY HIER, PROCESS_DEFINITION DEF
WHERE HIER.GROUP_SK = DEF.PROCESS_GROUP_SK
AND HIER.PARENT_PROCESS_SK = DEF.PROCESS_SK
AND HIER.PROCESS_SK in (4,5))
, CHILD_PROCESS AS (
SELECT HIER.HIERARCHY_SK, HIER.PROCESS_SK, DEF.PROCESS_CATEGORY_VAL AS CHILD_PROCESS, PARENT_HIERARCHY_ARRAY
FROM PROCESS_HIERARCHY HIER, PROCESS_DEFINITION DEF
WHERE HIER.GROUP_SK = DEF.PROCESS_GROUP_SK
AND HIER.CHILD_PROCESS_SK = DEF.PROCESS_SK
AND HIER.PROCESS_SK in (4,5))
SELECT BASE_PROCESS.HIERARCHY_SK
, BASE_PROCESS.CURRENT_PROCESS AS CURRENT_PROCESS
, PARENT_PROCESS.PARENT_PROCESS AS PARENT_PROCESS
, CHILD_PROCESS.CHILD_PROCESS AS CHILD_PROCESS
, BASE_PROCESS.PARENT_HIERARCHY_ARRAY
FROM BASE_PROCESS, PARENT_PROCESS, CHILD_PROCESS
WHERE BASE_PROCESS.HIERARCHY_SK = PARENT_PROCESS.HIERARCHY_SK
AND BASE_PROCESS.HIERARCHY_SK = CHILD_PROCESS.HIERARCHY_SK;