Рекурсивный выбор Oracle для поиска текущего идентификатора, связанного с клиентом

У меня есть таблица, содержащая историю идентификаторов клиентов, которые были объединены в нашу систему CRM. Данные в схеме Oracle исторической отчетности существуют в том виде, в каком они были на момент создания записей взаимодействия. Мне нужен способ найти текущий идентификатор, связанный с клиентом, из потенциально старого идентификатора. Чтобы сделать это немного более интересным, у меня нет разрешений на создание PL/SQL для этого, я могу только создавать операторы Select для этих данных.

Пример данных в таблице клиентов ID_MERGE_HIST

| OLD_ID   | NEW_ID   |
+----------+----------+
| 44678368 | 47306920 |
| 47306920 | 48352231 |
| 48352231 | 48780326 |
| 48780326 | 50044190 |

Пример таблицы взаимодействия

| INTERACTION_ID | CUST_ID  |
+----------------+----------+
| 1              | 44678368 |
| 2              | 48352231 |
| 3              | 80044190 |

Я хотел бы, чтобы запрос с рекурсивным подзапросом предоставлял набор результатов, который выглядит следующим образом:

| INTERACTION_ID | CUST_ID  | CUR_CUST_ID |
+----------------+----------+-------------+
| 1              | 44678368 | 50044190    |
| 2              | 48352231 | 50044190    |
| 3              | 80044190 | 80044190    |

Примечание. Cust_ID 80044190 никогда не объединялся, поэтому он не отображается в таблице ID_MERGE_HIST.

Любая помощь будет принята с благодарностью.


person BarryTheSprout    schedule 13.10.2014    source источник


Ответы (1)


Вы можете посмотреть конструкцию CONNECT BY.

Кроме того, вы можете поиграть с рекурсивным WITH (одно из описаний: http://gennick.com/database/understanding-the-with-clause). CONNECT BY лучше, но специфичен для ORACLE.

Если это частый запрос, вы можете сохранить первый/последний cust_id для всех связанных записей.

Первый cust_id — будет статическим, но потребуется 2 прыжка, чтобы добраться до текущего

Last cust_id - сразу даст вам результат, но требует обновления для всего дерева с каждой новой записью

person vav    schedule 13.10.2014
comment
На самом деле я начал с Connect By, но обнаружил, что он возвращает мне строку назад для каждой итерации. Увидев, что вы используете термин «первый» и «последний», я на самом деле подумал об агрегированных возможностях в Oracle, и я хочу попробовать обернуть выбор Connect By в другой выбор, используя Last. Дам вам знать, куда это меня приведет. - person BarryTheSprout; 15.10.2014
comment
Если у вас есть контроль над дизайном базы данных, эта ссылка может быть полезна: stackoverflow.com/questions/4048151/ - person vav; 16.10.2014