繁体   English   中英

PL/SQL 中的查找循环以找到最终值

[英]Lookup loop in PL/SQL to find a final value

项目清单

我有下面的初始值列表,我需要使用这些初始值在第二个合并列表中进行搜索。

初始值列表:

5753
5275
2553
1111
1234
1236
1238
2562
7464
3224

合并列表:

Loser      Winner 
1111       2222
3333       4444
1234       1235
2222       3333
1236       1237
1238       1239

进行第一次目视检查,我可以看到初始列表中的一个值,ID 1111 在合并列表中变为 ID 2222。 我的问题是这个合并可以有多个级别,因为 ID 2222 进一步变为 ID 3333,而 ID 3333 本身又进一步变为 ID 4444。这个列表没有特定的顺序,也不能排序,因为 ID 没有增量层次结构。

基本上,我想要的是创建一个 SQL 或 PL/SQL 查询,它为 ID 1111 分配最终值,应该是 ID 4444,而与合并列表中的顺序无关。 我知道这可以通过顺序 vLookup 在 Excel 中轻松完成,但不确定如何在 SQL 中复制它。

我将假设您有表格中的数据。 如果是这样,您可以使用分层查询并在CONNECT_BY_ISLEAF = 1上进行过滤以获取层次结构的最后一级,然后重新加入您的值列表:

测试数据

CREATE TABLE test_data ( value ) AS
SELECT 5753 FROM DUAL UNION ALL
SELECT 5275 FROM DUAL UNION ALL
SELECT 2553 FROM DUAL UNION ALL
SELECT 1111 FROM DUAL UNION ALL
SELECT 1234 FROM DUAL UNION ALL
SELECT 1236 FROM DUAL UNION ALL
SELECT 1238 FROM DUAL UNION ALL
SELECT 2562 FROM DUAL UNION ALL
SELECT 7464 FROM DUAL UNION ALL
SELECT 3224 FROM DUAL;

CREATE TABLE merges ( Loser, Winner ) AS
SELECT 1111, 2222 FROM DUAL UNION ALL
SELECT 3333, 4444 FROM DUAL UNION ALL
SELECT 1234, 1235 FROM DUAL UNION ALL
SELECT 2222, 3333 FROM DUAL UNION ALL
SELECT 1236, 1237 FROM DUAL UNION ALL
SELECT 1238, 1239 FROM DUAL;

查询

SELECT value,
       COALESCE( m.winner, value ) AS updated_value
FROM   test_data t
       LEFT OUTER JOIN (
         SELECT CONNECT_BY_ROOT( loser ) AS loser,
                winner
         FROM   merges
         WHERE  CONNECT_BY_ISLEAF = 1
         CONNECT BY PRIOR Winner = Loser
       ) m
       ON ( t.value = m.loser );

Output

 价值 |  UPDATED_VALUE ----: |  ------------: 1111 |  4444 1234 |  1235 1236 |  1237 1238 |  1239 2562 |  2562 7464 |  7464 5753 |  5753 5275 |  5275 2553 |  2553 3224 |  3224

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM