sql - 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
我需要帮助为这种情况编写查询
解决方案
这是一个使用 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
推荐阅读
- java - 为什么@EnableWs 从 spring bean 中删除了 aop 代理
- javascript - 我需要做什么才能创建幻灯片
- java - 在 JAVA 中显示格式 XX:00
- asp.net-mvc - 将模型传递给局部视图不起作用
- java - 没有找到 org.apache.http.annotation.NotThreadSafe 的类文件,我该如何在 intellij idea 上修复它?
- c# - string.split 从大字符串中解析 url
- angular - 如何使用 *ngFor 指令从 Ionic 3(Cordova、Ionic 3、Angular 5)上的存储中获取数据
- python - 以不同的顺序将日期时间转换为 UTC
- fortran - Fortran arctan 子例程未按预期工作
- ios - 无法让 API 调用及时运行 tableview swift 4 xcode 9