• 组织架构中组长和组员之间的关系。

  • 企业中上下级部门之间的关系。

  • Web 网页中,页面跳转的关系。

使用和实现层次查询最关键是要理解其执行流程,层次查询执行流程:

  1. 根据 START WITHCONNECT BY 的内容生成层次关系结果;

  2. 按照常规查询执行流程执行剩下的子句(例如 WHEREGROUPORDER BY……)对于 2 中生成层次关系的流程可以理解为:

  3. 根据 START WITH 中的表达式得到根行(Root rows)。

  4. 根据 CONNECT BY 中的表达式 选择每个根行(Root rows)的子行(Child rows)。

  5. 将 2 中生成的子行(Child rows)作为新的根行(Root rows)进一步生成子行(Child rows),周而复始直到没有新行生成。

展示层次查询的使用,向表 emp中的 emp_idpositionmgr_id 列插入数据。执行以下语句:

  1. CREATE TABLE emp(emp_id INT,position VARCHAR(50),mgr_id INT);
  2. INSERT INTO emp VALUES (1,'全球经理',NULL);
  3. INSERT INTO emp VALUES (2,'欧洲区经理',1);
  4. INSERT INTO emp VALUES (3,'亚太区经理',1);
  5. INSERT INTO emp VALUES (5,'意大利区经理',2);
  6. INSERT INTO emp VALUES (6,'法国区经理',2);
  7. INSERT INTO emp VALUES (7,'中国区经理',3);
  8. INSERT INTO emp VALUES (8,'韩国区经理',3);
  9. INSERT INTO emp VALUES (9,'日本区经理',3);
  10. INSERT INTO emp VALUES (10,'美国区经理',4);
  11. INSERT INTO emp VALUES (11,'加拿大区经理',4);
  12. INSERT INTO emp VALUES (12,'北京区经理',7);

通过上面的内容可以看见列 position 具有清晰的层次关系。树状结构如下:

是按照层次结构将结果展示出来,执行以下语句:

查询结果如下:

  1. +--------+--------+-------------------+-------+
  2. | EMP_ID | MGR_ID | POSITION | LEVEL |
  3. +--------+--------+-------------------+-------+
  4. | 1 | NULL| 全球经理 | 1 |
  5. | 2 | 1 | 欧洲区经理 | 2 |
  6. | 5 | 2 | 意大利区经理 | 3 |
  7. | 6 | 2 | 法国区经理 | 3 |
  8. | 12 | 7 | 北京区经理 | 4 |
  9. | 8 | 3 | 韩国区经理 | 3 |
  10. | 9 | 3 | 日本区经理 | 3 |
  11. | 4 | 1 | 美洲区经理 | 2 |
  12. | 10 | 4 | 美国区经理 | 3 |
  13. | 11 | 4 | 加拿大区经理 | 3 |
  14. +--------+--------+-------------------+-------+

如果仅查询“亚太区”的层次结构,执行以下语句:

查询结果如下:

  1. +--------+--------+----------------+-------+
  2. | EMP_ID | MGR_ID | POSITION | LEVEL |
  3. +--------+--------+----------------+-------+
  4. | 3 | 1 | 亚太区经理 | 1 |
  5. | 7 | 3 | 中国区经理 | 2 |
  6. | 12 | 7 | 北京区经理 | 3 |
  7. | 8 | 3 | 韩国区经理 | 2 |
  8. +--------+--------+----------------+-------+