oralce sql Connect by功能详解

    技术2022-05-20  39

    --connect by 使用详解

     

    基本用法实例:

      SELECT ename, job, ename FROM scott.emp emp START WITH ename IN ('WARD') CONNECT BY empno = PRIOR mgr;

    START WITH:表示递归的种子,即从哪里开始CONNECT BY:描述递归步骤,即怎么找下一层PRIOR:指上一层的

    集合用法每个关键词都可以独立用,这里集中在一起用:

    SELECT LEVEL, ename, job, sal, connect_by_root ename root, sys_connect_by_path(ename, ':') chain, connect_by_iscycle iscycle, connect_by_isleaf isleaf FROM scott.emp emp START WITH ename IN ('WARD', 'SMITH', 'ADAMS') CONNECT BY nocycle empno = PRIOR mgr ORDER SIBLINGS BY sal; LEVEL伪列:表明产生的行属于第几步递归CONNECT_BY_ROOT:返回指定字段的根的值SYS_CONNECT_BY_PATH:返回指定字段的从根到当前行的路径ORDER SIBLINGS BY:在同一父亲下,各个兄弟按指定的字段排序NOCYCLE:防止递归进入死循环CONNECT_BY_ISCYCLE:如果当前行是循环的一部分,则返回1,否则返回0CONNECT_BY_ISLEAF:如果当前行是叶子,则返回1,否则返回0

    特殊用法:拆分字符串实例:

    SELECT substr('@未到期@1-2天@30@Linux@Windows', instr('@未到期@1-2天@30@Linux@Windows', '@', 1, LEVEL), decode(LEVEL, (length('@未到期@1-2天@30@Linux@Windows') - length(REPLACE('@未到期@1-2天@30@Linux@Windows', '@', ''))), length('@未到期@1-2天@30@Linux@Windows'), instr('@未到期@1-2天@30@Linux@Windows', '@', 1, LEVEL + 1)) - instr('@未到期@1-2天@30@Linux@Windows', '@', 1, LEVEL)) dt FROM dual CONNECT BY LEVEL <= (length('@未到期@1-2天@30@Linux@Windows') - length(REPLACE('@未到期@1-2天@30@Linux@Windows', '@', ''))); 可用在PL/SQL中,对某一变量进行拆分,比如来自CSV文件的内容。


    最新回复(0)