测试数据

-- 创建部门表
CREATE TABLE DEPT (
  DEPT_ID INT PRIMARY KEY,
  DEPT_NAME VARCHAR2(100),
  PARENT_DEPT_ID INT
);

-- 插入测试数据
INSERT INTO DEPT (DEPT_ID, DEPT_NAME, PARENT_DEPT_ID) VALUES (1, '总部', NULL);
INSERT INTO DEPT (DEPT_ID, DEPT_NAME, PARENT_DEPT_ID) VALUES (2, '研发部', 1);
INSERT INTO DEPT (DEPT_ID, DEPT_NAME, PARENT_DEPT_ID) VALUES (3, '市场部', 1);
INSERT INTO DEPT (DEPT_ID, DEPT_NAME, PARENT_DEPT_ID) VALUES (4, '技术组', 2);
INSERT INTO DEPT (DEPT_ID, DEPT_NAME, PARENT_DEPT_ID) VALUES (5, '销售组', 3);

代码实现

使用CONNECT BY 实现

-- 查询某个部门及其所有子部门的信息
-- DEPT_ID是我们指定的起始部门ID参数
SELECT DEPT_ID, DEPT_NAME, PARENT_DEPT_ID
FROM DEPT
START WITH DEPT_ID = 1
CONNECT BY PRIOR DEPT_ID = PARENT_DEPT_ID;

使用WITH子表实现

-- 使用WITH子句实现递归查询
WITH RECURSIVE_DEPT(DEPT_ID, DEPT_NAME, PARENT_DEPT_ID) AS (
  SELECT T1.DEPT_ID, T1.DEPT_NAME, T1.PARENT_DEPT_ID
  FROM DEPT T1
  WHERE  T1.DEPT_ID = 1
  UNION ALL
  SELECT T2.DEPT_ID, T2.DEPT_NAME, T2.PARENT_DEPT_ID
  FROM DEPT T2
  INNER JOIN RECURSIVE_DEPT ON T2.PARENT_DEPT_ID = RECURSIVE_DEPT.DEPT_ID
)
SELECT DEPT_ID, DEPT_NAME, PARENT_DEPT_ID
FROM RECURSIVE_DEPT;