首页 > 解决方案 > Oracle 复杂层次结构

问题描述

一般来说,我有一个键(合同)可以连续更改为另一个键。更改后的密钥可以更改,为此我们还有另一行。钥匙回到最初的样子。我需要为第一个键(一切开始的地方)和最新的键(跳过介于两者之间的所有其他键)设置一行。

这将创建表:

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 行仅返回 ONE ROW。

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

为什么?因为

1   Becomes 10
10  Becomes 6
6   Becomes 1   

接下来的 3 行仅返回 ONE ROW。

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

为什么?因为

3   Becomes 2
2   Becomes 8
8   Becomes 20

最后一行返回 ONE ROW。

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

为什么?因为

4   Becomes 11

我需要帮助为这种情况编写查询

标签: sqloraclehierarchy

解决方案


这是一个使用 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

结果

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

推荐阅读