语法特性表

下面将神通数据库层次查询各关键字、函数、伪列的语法特性总结在一个表格中。 第一行给出了层次查询的这些元素,第一列给出了语句中可能出现这些元素的位置, 由于版面限制,第一行中的元素采用简称:

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, 列不存在。

表63 神通数据库系统层次查询元素的语法特性
  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兼容。

表64 神通数据库系统层次查询元素的语法特性与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子句中, 并保证结果是正确的。