Заменить массив строк столбца ключей <n numer of> на массив значений из таблицы в SQL (Netezza) - PullRequest
0 голосов
/ 28 мая 2019

У меня есть модель данных (в 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;
...