Найти все зависимости между клиентами с помощью рекурсивного запроса ORACLE 11G - PullRequest
0 голосов
/ 18 октября 2019

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

Я создал образец набора данных и структуру таблицы:

create table T_CUSTOMER_RELATIONSHIP (CUST_ID VARCHAR2(10), OTHER_CUST_ID VARCHAR2(10))

insert into T_CUSTOMER_RELATIONSHIP values ('CUST1', 'CUST1');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST1', 'CUST2');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST1', 'CUST3');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST1', 'CUST4');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST5', 'CUST5');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST5', 'CUST4');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST5', 'CUST6');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST7', 'CUST7');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST7', 'CUST6');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST8', 'CUST8');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST8', 'CUST9');
insert into T_CUSTOMER_RELATIONSHIP values ('CUST8', 'CUST10');

commit;

«Первичные» записи клиентов имеют одинаковые значения CUST_ID и OTHER_CUST_ID (так что ... CUST_ID1, CUST_ID5, CUST_ID7, CUST_ID8 являются «основными» клиентами)

Я хочу получить набор результатов для (скажем) CUST_ID1 следующим образом:

CUST_ID   OTHER_CUST_ID
CUST1     CUST2
CUST1     CUST3
CUST1     CUST4
CUST1     CUST5
CUST1     CUST6
CUST1     CUST7

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

Возможно ли это?

1 Ответ

0 голосов
/ 18 октября 2019

Вы можете использовать иерархический запрос:

SELECT DISTINCT
       CONNECT_BY_ROOT( cust_id ) AS cust_id,
       other_cust_id
FROM   T_CUSTOMER_RELATIONSHIP
START WITH cust_id = 'CUST1'
CONNECT BY NOCYCLE
       (  PRIOR other_cust_id IN ( cust_id, other_cust_id )
       OR PRIOR cust_id       IN ( cust_id, other_cust_id ) )
ORDER BY cust_id, other_cust_id;

выходные данные:

CUST_ID | OTHER_CUST_ID
:------ | :------------
CUST1   | CUST1        
CUST1   | CUST2        
CUST1   | CUST3        
CUST1   | CUST4        
CUST1   | CUST5        
CUST1   | CUST6        
CUST1   | CUST7        

db <> Fiddle здесь

...