语法特性表¶
下面将神通数据库层次查询各关键字、函数、伪列的语法特性总结在一个表格中。 第一行给出了层次查询的这些元素,第一列给出了语句中可能出现这些元素的位置, 由于版面限制,第一行中的元素采用简称:
PRIOR — PRIOR
ROOT — CONNECT_BY_ROOT
PATH — SYS_CONNECT_BY_PATH
LEVEL — LEVEL
LEAF — CONNECT_BY_ISLEAF
CYCLE — CONNECT_BY_ISCYCLE
表中的“Y”表示神通数据库支持这种语法,“N”表示神通数据库不支持这种语法,括号中的符号表示使用别名的情况。
比如下面的两条语句:
SELECT employee_id, last_name, manager_id, level,
sys_connect_by_path (last_name,'/'), prior employee_id pr_empid
from EMPLOYEES
START WITH prior employee_id IS NULL AND last_name = 'Kochhar'
CONNECT BY PRIOR employee_id = manager_id
ORDER SIBLINGS BY last_name;
上面这条语句是允许的。
SELECT employee_id, last_name, manager_id, level,
sys_connect_by_path (last_name,'/'), prior employee_id pr_empid
from EMPLOYEES
START WITH **pr_empid** IS NULL AND last_name = 'Kochhar'
CONNECT BY PRIOR employee_id = manager_id
ORDER SIBLINGS BY last_name;
而这条语句会报错:ERROR, Analyze, 列不存在。
| PRIOR | ROOT | PATH | LEVEL | LEAF | CYCLE | |
|---|---|---|---|---|---|---|
| 目标列 | Y | Y | Y | Y | Y | Y |
| CONNECT BY | Y(N) | N(N) | N(N) | Y(N) | N(N) | N(N) |
| START WITH | Y(N) | N(N) | N(N) | Y(N) | N(N) | N(N) |
| ORDER SIBLINGS BY | N(N) | N(N) | N(N) | N(N) | N(N) | N(N) |
| ORDER BY | Y(Y) | Y(Y) | Y(Y) | Y(Y) | Y(Y) | Y(Y) |
| AGG() | Y | Y | Y | Y | Y | Y |
| GROUP BY | Y | Y | Y | Y | Y | Y |
| HAVING | Y | Y | N | Y | Y | Y |
| WHERE | Y(N) | Y(N) | N(N) | Y(N) | Y(N) | Y(N) |
| PRIOR | N | N | N | N(N) | N(N) | N(N) |
| ROOT | N | N | N | N(N) | N(N) | N(N) |
| PATH() | N | N | N | Y | N | N |
下面这个表格给出了神通数据库与ORACLE在层次查询功能上,语法不兼容的地方, “Y”表示ORACLE支持,而神通数据库不支持;“N”表示ORACLE不支持,而神通数据库能够支持。 “E”表示ORACLE语法上支持,但是可能会导致异常,或者结果不正确, 对于这种情况,神通数据库也不支持。未标识的地方表示神通数据库与ORACLE兼容。
| PRIOR | ROOT | PATH | LEVEL | LEAF | CYCLE | |
|---|---|---|---|---|---|---|
| 目标列 | ||||||
| CONNECT BY | Y | Y | ||||
| START WITH | Y | Y | ||||
| ORDER SIBLINGS BY | Y(E) | Y(E) | (Y) | Y(Y) | Y(Y) | |
| ORDER BY | N | |||||
| AGG() | ||||||
| GROUP BY | N | |||||
| HAVING | ||||||
| WHERE | ||||||
| PRIOR | Y | Y | ||||
| ROOT | E | E | Y | Y | Y | |
| PATH() | Y | Y | Y | Y |
对于Oracle会出错的地方,我们给出如下用例:
SELECT employee_id, last_name, manager_id, level, sys_connect_by_path (last_name,'/'), prior employee_id pr_empid from EMPLOYEES START WITH last_name = 'Kochhar' CONNECT BY PRIOR employee_id = manager_id ORDER SIBLINGS BY pr_empid;
--返回结果有错
SELECT employee_id, last_name, manager_id, level, sys_connect_by_path (last_name,'/'), connect_by_root employee_id rt_empid from EMPLOYEES START WITH last_name = 'Kochhar' CONNECT BY PRIOR employee_id = manager_id ORDER SIBLINGS BY rt_empid;
--内部错误
SELECT employee_id, manager_id, level, connect_by_root (prior employee_id) from EMPLOYEES CONNECT BY PRIOR employee_id = manager_id;
--通信通道的文件结束
SELECT employee_id, last_name, manager_id, level, connect_by_root sys_connect_by_path(last_name,'/') rt_path from EMPLOYEES START WITH last_name = 'Kochhar' CONNECT BY PRIOR employee_id = manager_id ORDER SIBLINGS BY last_name;
--返回结果有错
上面四条语句中粗体的地方表示这样使用会导致ORACLE异常或不能得到正确结果。 其实还有一些层次查询元素的使用方法会导致ORACLE出错,我们在此就不做讨论了。
总之,由于ORACLE在一些层次查询语句的表现上不是很令人满意, 所以神通数据库舍弃了相应的使用方法,并在语法上加以禁止。 另外,由于神通数据库自身实现的特性, 使得神通数据库允许层次查询的SYS_CONNECT_BY_PATH函数出现在ORDER BY和GROUP BY子句中, 并保证结果是正确的。