Oracle综合体系

时间:2018-11-21 08:42:37

标签: sql oracle hierarchy

通常,我有一个键(合同),可以连续更改为另一个键。 更改后的密钥可以更改,为此,我们还有另一行。 钥匙可以回到开始时的样子。 我需要为第一个键(所有键均从此处开始)和最新的键(即跳过介于两者之间的所有其他键)一行。

这将创建表:

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

最后一行返回ONE ROW。

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

为什么?因为

4   Becomes 11

我需要针对这种情况编写查询的帮助

1 个答案:

答案 0 :(得分:0)

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