Сложная иерархия Oracle - PullRequest
       7

Сложная иерархия Oracle

0 голосов
/ 21 ноября 2018

В общем, у меня есть ключ (контракт), который меняется на другой ключ подряд.Измененный ключ можно изменить, и для этого у нас есть еще один ряд.Ключ вернуться назад, как это было в начале.Мне нужна строка для первого ключа (где все это началось) и самого нового ключа (который пропускает все остальные ключи, которые были между ними). ​​

Это создает таблицу:

CREATE TABLE CONTRACT ("NAME" VARCHAR2(20 BYTE)
                                   ,"OLD_CONTRACT" VARCHAR2(20 BYTE)
                                   ,"NEW_CONTRACT" VARCHAR2(20 BYTE)
                                   ,"NEW_CONTRACT_DATE" NUMBER(10)) ;

COMMIT;

INSERT INTO CONTRACT (NAME,OLD_CONTRACT,NEW_CONTRACT,NEW_CONTRACT_DATE)
VALUES ('John','1','10',20180101);
INSERT INTO CONTRACT (NAME,OLD_CONTRACT,NEW_CONTRACT,NEW_CONTRACT_DATE)
VALUES ('Ronnie','10','6',20180107);
INSERT INTO CONTRACT (NAME,OLD_CONTRACT,NEW_CONTRACT,NEW_CONTRACT_DATE) 
VALUES ('Kim','6','1',20180128);
INSERT INTO CONTRACT (NAME,OLD_CONTRACT,NEW_CONTRACT,NEW_CONTRACT_DATE) 
VALUES ('Nathaly','3','2',20180419);
INSERT INTO CONTRACT (NAME,OLD_CONTRACT,NEW_CONTRACT,NEW_CONTRACT_DATE)
VALUES ('Gorge','2','8',20180713);
INSERT INTO CONTRACT (NAME,OLD_CONTRACT,NEW_CONTRACT,NEW_CONTRACT_DATE) 
VALUES ('Allen','8','20',20180921);
INSERT INTO CONTRACT (NAME,OLD_CONTRACT,NEW_CONTRACT,NEW_CONTRACT_DATE) 
VALUES ('Tom','4','11',20170103);

COMMIT;

Вот как это выглядит

Name    old_key      new Key    Updated date 
----    -------      -------    ------------ 
John      1             10      20180101
Ronnie    10             6      20180107
Kim        6             1      20180128
Nathaly    3             2      20180419
Gorge      2             8      20180713
Allen      8             20     20180921
Tom        4             11     20170103

Первые 3 строки возвращают только ОДНУ СТРОКУ.

Old Key  New Key
-------  -------
   1        1

Почему?Потому что

1   Becomes 10
10  Becomes 6
6   Becomes 1   

Следующие 3 строки возвращают только ОДНУ СТРОКУ.

Old Key  New Key
-------  -------
   3        20

Почему?Потому что

3   Becomes 2
2   Becomes 8
8   Becomes 20

Последняя строка возвращает ОДНУ СТРОКУ.

Old Key  New Key
-------  -------
   4        11

Почему?Потому что

4   Becomes 11

Мне нужна помощь в написании запроса для этого сценария

1 Ответ

0 голосов
/ 21 ноября 2018

Вот запрос, использующий CONNECT BY, который делает соединение, которое вы хотите и нуждаетесь.Из его результатов вы должны выбрать первый old_contract и последний new_contract.

SELECT NAME,OLD_CONTRACT,NEW_CONTRACT, LEVEL, rownum 
FROM contract
START WITH OLD_CONTRACT = 3
CONNECT BY NOCYCLE PRIOR NEW_CONTRACT = OLD_CONTRACT

Results

NAME    OLD_CONTRACT    NEW_CONTRACT    LEVEL   ROWNUM
Nathaly 3               2               1       1
Gorge   2               8               2       2
Allen   8               20              3       3
...