发布网友 发布时间:2022-04-09 03:38
共1个回答
热心网友 时间:2022-04-09 05:08
缺少这项特性,就需要一个复杂的自联接来确定行之间的逻辑联系。START WITH子句指定被认为是层次起点,或“根”的一行或几行。然后CONNECT BY PRIOR子句指明哪些行彼此关联。 例如,列表A中的查询从Oracle HR样本模式的EMPLOYEES表中生成一个“Reports To”列表。 column "Reports To" format a30 set pagesize 9999 SELECT LPAD(' ', 2*(LEVEL-1))||last_name "Reports To", employee_id FROM employees START WITH employee_id IN (101, 102) CONNECT BY PRIOR employee_id = manager_id /列表ALEVEL伪列表明报告当前嵌套的深度,这里我使用LPAD雇员姓名对它们进行缩排。START WITH条件指出只有雇员101和102被认为是起点。然后CONNECT BY PRIOR子句将一行中的employee_id列与另一行的manager_id列连接起来,指出谁向谁报告。 如果你在HR模式中运行这个查询,你会注意到某个经理列表中的姓没有分类,它们以Oracle在处理层次时遇到它们的顺序排列。 如果你希望下属以字母顺序排列,你可以尝试对原始的last_name列使用ORDER BY。但是,这样会破坏层次,把它变回一个单调的姓名列表。 SQL> @siblings_without_orderby Reports To EMPLOYEE_ID ------------------------------ ----------- Kochhar 101 Whalen 200 Mavris 203 Baer 204 Higgins 205 Gietz 206 Greenberg 108 Faviet 109 Chen 110 Sciarra 111 Urman 112 Popp 113 De Haan 102 Hunold 103 Ernst 104 Austin 105 Pataballa 106 Lorentz 107 18 rows selected. SQL> @siblings_with_orderby Reports To EMPLOYEE_ID ------------------------------ ----------- De Haan 102 Hunold 103 Austin 105 Ernst 104 Lorentz 107 Pataballa 106 Kochhar 101 Baer 204 Greenberg 108 Chen 110 Faviet 109 Popp 113 Sciarra 111 Urman 112 Higgins 205 Gietz 206 Mavris 203 Whalen 200 18 rows selected. SQL>列表B(责任编辑:卢兆林)