Цикл поиска в PL / SQL, чтобы найти окончательное значение - PullRequest
1 голос
/ 16 октября 2019

Элемент списка

Ниже приведен список начальных значений, которые мне нужно использовать для поиска во втором Списке слияний.

Список начальных значений:

5753
5275
2553
1111
1234
1236
1238
2562
7464
3224

Список слияний:

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

Выполняя первую визуальную проверку, я вижу, что одним из значений из исходного списка, идентификатор 1111 становится идентификатором 2222 в списке слияний. Моя проблема заключается в том, что это объединение может иметь несколько уровней, поскольку идентификатор 2222 дополнительно становится идентификатором 3333, который сам затем становится идентификатором 4444. Этот список не имеет определенного порядка, и его нельзя упорядочить, поскольку идентификаторы не имеют возрастающей иерархии.

По сути, я хочу создать запрос SQL или PL / SQL, который назначит конечное значение для идентификатора 1111, который должен быть идентификатором 4444, независимо от порядка в списке слияний. Я знаю, что это легко сделать в Excel с помощью последовательного vLookup, но не уверен, как это можно реплицировать в SQL.

1 Ответ

2 голосов
/ 16 октября 2019

Я собираюсь предположить, что у вас есть данные в таблицах. Если это так, вы можете использовать иерархический запрос и фильтр на 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 );

Выход :

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

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...