Sql 通过“忽略无父对象的子对象”连接

Sql 通过“忽略无父对象的子对象”连接,sql,oracle,Sql,Oracle,我试着使用这篇原始文章中的解决方案。然而,我似乎仍然无法解决我的问题(除非我在使用这个解决方案时遗漏了一些东西)。在本例中,它仍然显示Emp Id 2 GM及其子代(不再活跃)和Emp Id 3 PRJMGR及其子代(不再是PRJMGR,现在是GM)的等级 我已经使用livesql.oracle.com构建了这个示例,如果有人需要一个地方来运行/玩这个示例: DROP TABLE EMPLOYEE; DROP TABLE EMPLOYEE_ASSIGNMENT; DROP TABLE COMPA

我试着使用这篇原始文章中的解决方案。然而,我似乎仍然无法解决我的问题(除非我在使用这个解决方案时遗漏了一些东西)。在本例中,它仍然显示Emp Id 2 GM及其子代(不再活跃)和Emp Id 3 PRJMGR及其子代(不再是PRJMGR,现在是GM)的等级

我已经使用livesql.oracle.com构建了这个示例,如果有人需要一个地方来运行/玩这个示例:

DROP TABLE EMPLOYEE;
DROP TABLE EMPLOYEE_ASSIGNMENT;
DROP TABLE COMPANY_STRUCTURE_POSITION;
CREATE TABLE EMPLOYEE (EMPLOYEE_ID VARCHAR2(15 CHAR));
CREATE TABLE EMPLOYEE_ASSIGNMENT (EMPLOYEE_ID VARCHAR(15 CHAR),
                                  POSITION_CODE VARCHAR2(10 CHAR),
                                  VALID_FROM DATE,
                                  VALID_TO DATE);
CREATE TABLE COMPANY_STRUCTURE_POSITION (POSITION_CODE VARCHAR2(10 CHAR),
                                         SUPERVISOR_POSITION_CODE VARCHAR2(10 CHAR));
INSERT INTO EMPLOYEE VALUES ('1');
INSERT INTO EMPLOYEE VALUES ('2');
INSERT INTO EMPLOYEE VALUES ('3');
INSERT INTO EMPLOYEE VALUES ('4');
INSERT INTO EMPLOYEE VALUES ('5');          
INSERT INTO EMPLOYEE VALUES ('6');
INSERT INTO EMPLOYEE VALUES ('7');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('1', 'CEO', '01-JAN-18', '31-DEC-18');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('2', 'GM', '01-JAN-18', '30-JUN-18');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('3', 'GM', '01-JUL-18', '31-DEC-18');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('3', 'PRJMGR', '01-JAN-18', '30-JUN-18');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('4', 'PRJMGR', '01-JUL-18', '31-DEC-18');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('5', 'HR', '01-JAN-18', '31-DEC-18');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('6', 'PNT', '01-JAN-18', '31-DEC-18');
INSERT INTO EMPLOYEE_ASSIGNMENT VALUES ('7', 'WLD', '01-JAN-18', '31-DEC-18');
INSERT INTO COMPANY_STRUCTURE_POSITION VALUES ('CEO', '*');
INSERT INTO COMPANY_STRUCTURE_POSITION VALUES ('GM', 'CEO');
INSERT INTO COMPANY_STRUCTURE_POSITION VALUES ('PRJMGR', 'GM');
INSERT INTO COMPANY_STRUCTURE_POSITION VALUES ('HR', 'CEO');
INSERT INTO COMPANY_STRUCTURE_POSITION VALUES ('PNT', 'PRJMGR');
INSERT INTO COMPANY_STRUCTURE_POSITION VALUES ('WLD', 'PRJMGR');
SELECT sys_connect_by_path(e.employee_id, '->') EMPLOYEE_PATH, 
       sys_connect_by_path(csp.position_code, '->') POSITION_CODE_PATH, 
       level,  
       e.*, 
       ea.*, 
       csp.* 
FROM employee e 
INNER JOIN employee_assignment ea ON ea.employee_id = e.employee_id 
INNER JOIN company_structure_position csp ON csp.position_code = ea.position_code 
WHERE ea.valid_from <= TRUNC(sysdate) 
AND ea.valid_to >= TRUNC(sysdate) 
START WITH csp.supervisor_position_code = '*' 
AND ea.valid_from <= TRUNC(sysdate) 
AND ea.valid_to >= TRUNC(sysdate) 
CONNECT BY PRIOR csp.position_code = csp.supervisor_position_code
DROP TABLE EMPLOYEE;
删除员工分配表;
下拉表公司结构位置;
创建表EMPLOYEE(EMPLOYEE_ID VARCHAR2(15个字符));
创建表EMPLOYEE_分配(EMPLOYEE_ID VARCHAR(15个字符),
位置代码VARCHAR2(10字符),
自日期起生效,
有效期(到目前为止);
创建表格公司结构位置(位置代码VARCHAR2(10个字符),
主管职位代码VARCHAR2(10个字符);
插入员工价值观(“1”);
插入员工价值观(“2”);
插入员工价值观(“3”);
插入员工价值观(“4”);
插入员工价值观(“5”);
插入员工价值观(“6”);
插入员工价值观(“7”);
在员工分配值中插入(“1”、“CEO”、“2018年1月1日”、“2018年12月31日”);
在员工分配值中插入(“2”、“GM”、“2018年1月1日”、“2018年6月30日”);
在员工分配值中插入(“3”、“GM”、“2018年7月1日”、“2018年12月31日”);
在员工分配值中插入(“3”、“PRJMGR”、“2018年1月1日”、“2018年6月30日”);
在员工分配值中插入(“4”、“PRJMGR”、“2018年7月1日”、“2018年12月31日”);
在员工分配值中插入(“5”、“HR”、“2018年1月1日”、“2018年12月31日”);
在员工分配值中插入(“6”、“PNT”、“2018年1月1日”、“2018年12月31日”);
在员工分配值中插入('7','WLD','01-JAN-18','31-DEC-18');
在公司结构中插入职位值(“CEO”和“*”);
在公司结构中插入职位值(“总经理”、“首席执行官”);
在公司结构中插入位置值(“PRJMGR”、“GM”);
在公司结构中插入职位值(“HR”、“CEO”);
在公司结构中插入位置值(“PNT”、“PRJMGR”);
在公司结构中插入位置值(“WLD”、“PRJMGR”);
选择系统连接路径(例如员工id“->”)员工路径,
系统连接路径(csp.position代码“-->”)位置代码路径,
水平,
e、 *,
ea.*,
顾客服务提供商*
来自雇员e
内部加入员工分配ea ON ea.employee\u id=e.employee\u id
内部连接公司\结构\在csp上定位csp。定位\代码=ea.position\代码
其中ea.valid_from=TRUNC(sysdate)
从csp.supervisor\u position\u code='*'开始
和ea.valid_from=TRUNC(sysdate)
通过先前的csp.position\u代码连接=csp.supervisor\u position\u代码
结果SQL:

| EMPLOYEE_PATH | POSITION_CODE_PATH | LEVEL | EMP_ID | EMP_ID | POS_CODE | VALID_FROM | VALID_TO | POS_CODE | SUP_POS_CODE | --------------------------------------------------------------------------------------------------------------------------------- | ->1 |->CEO | 1 | 1 | 1 | CEO | 01-JAN-18 | 31-DEC-18 | CEO | * | | ->1->2->3->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR | | ->1->2->3->7 |->CEO->GM->PRJMGR->WLD | 4 | 7 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR | | ->1->2->4 |->CEO->GM->PRJMGR | 3 | 4 | 4 | PRJMGR | 01-JUL-18 | 31-DEC-18 | PRJMGR | GM | | ->1->2->4->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR | | ->1->2->4->7 |->CEO->GM->PRJMGR->WLD | 4 | 7 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR | | ->1->3 |->CEO->GM | 2 | 3 | 3 | GM | 01-JUL-18 | 31-DEC-18 | GM | CEO | | ->1->3->3->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR | | ->1->3->3->7 |->CEO->GM->PRJMGR->WLD | 4 | 7 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR | | ->1->3->4 |->CEO->GM->PRJMGR | 3 | 4 | 4 | PRJMGR | 01-JUL-18 | 31-DEC-18 | PRJMGR | GM | | ->1->3->4->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR | | ->1->3->4->7 |->CEO->GM->PRJMGR->WLD | 4 | 7 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR | | ->1->5 |->CEO->HR | 2 | 5 | 5 | HR | 01-JAN-18 | 31-DEC-18 | HR | CEO | |员工路径|职位|代码|路径|级别| EMP | ID | EMP | ID |岗位代码|有效|从|有效|岗位代码|辅助岗位代码|| --------------------------------------------------------------------------------------------------------------------------------- |->1 |->首席执行官| 1 | 1 |首席执行官| 18年1月1日| 18年12月31日|首席执行官|*| |->1->2->3->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR| |->1->2->3->7 |->CEO->GM->PRJMGR->WLD | 4 | 7 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR| |->1->2->4 |->CEO->GM->PRJMGR | 3 | 4 | PRJMGR | 2018年7月1日| 2018年12月31日| PRJMGR | GM| |->1->2->4->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR| |->1->2->4->7 |->CEO->GM->PRJMGR->WLD 4 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR| |->1->3 |->CEO->GM | 2 | 3 | GM | 01-JUL-18 | 31-DEC-18 | GM | CEO| |->1->3->3->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR| |->1->3->3->7 |->CEO->GM->PRJMGR->WLD | 4 | 7 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR| |->1->3->4 |->CEO->GM->PRJMGR | 3 | 4 | PRJMGR | 18年7月1日| 18年12月31日| PRJMGR | GM | |->1->3->4->6 |->CEO->GM->PRJMGR->PNT | 4 | 6 | 6 | PNT | 01-JAN-18 | 31-DEC-18 | PNT | PRJMGR| |->1->3->4->7 |->CEO->GM->PRJMGR->WLD | 4 | 7 | 7 | WLD | 01-JAN-18 | 31-DEC-18 | WLD | PRJMGR| |->1->5 |->CEO->HR | 2 | 5 | HR | 01-JAN-18 | 31-DEC-18 | HR | CEO |
感谢您的建议。

CONNECT BY
子句中包含不通过非活动节点连接的条件。像这样:

CONNECT BY PRIOR csp.position_code = csp.supervisor_position_code
AND ea.valid_from <= TRUNC(sysdate) 
AND ea.valid_to >= TRUNC(sysdate) 
通过先前的csp.position\u代码连接=csp.supervisor\u position\u代码
和ea.valid_from=TRUNC(sysdate)