使用递归查询ORACLE 11G查找客户之间的所有依赖关系
Find all dependencies between customers with recursive query ORACLE 11G
我正在尝试编写一个递归 CTE 来为我提供 "primary customer" 所依赖的所有其他客户,但我不知道从哪里开始。
我已经创建了样本数据集和table结构:
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;
"primary" 客户记录的值与 CUST_ID 和 OTHER_CUST_ID 相同(所以...CUST_ID1,CUST_ID5,CUST_ID7 个,CUST_ID8 个是 "primary" 个客户)
我想获得(比如)CUST_ID1 的结果集如下:
CUST_ID OTHER_CUST_ID
CUST1 CUST2
CUST1 CUST3
CUST1 CUST4
CUST1 CUST5
CUST1 CUST6
CUST1 CUST7
...这将允许我设置一个提取脚本,该脚本将提取 CUST1 直接相关或通过与另一个主要客户(及其相关的)的共同关系相关的所有客户的所有详细信息客户,因此递归)
这可能吗?
您可以使用分层查询:
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 here
我正在尝试编写一个递归 CTE 来为我提供 "primary customer" 所依赖的所有其他客户,但我不知道从哪里开始。
我已经创建了样本数据集和table结构:
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;
"primary" 客户记录的值与 CUST_ID 和 OTHER_CUST_ID 相同(所以...CUST_ID1,CUST_ID5,CUST_ID7 个,CUST_ID8 个是 "primary" 个客户)
我想获得(比如)CUST_ID1 的结果集如下:
CUST_ID OTHER_CUST_ID
CUST1 CUST2
CUST1 CUST3
CUST1 CUST4
CUST1 CUST5
CUST1 CUST6
CUST1 CUST7
...这将允许我设置一个提取脚本,该脚本将提取 CUST1 直接相关或通过与另一个主要客户(及其相关的)的共同关系相关的所有客户的所有详细信息客户,因此递归)
这可能吗?
您可以使用分层查询:
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 here