selectAD_DEPARTMENT_CODE, AD_DEPARTMENT_UP_LEVEL, AD_DEPARTMENT_NAME from(selectAD_DEPARTMENT_CODE, AD_DEPARTMENT_UP_LEVEL, AD_DEPARTMENT_NAME fromAD_DEPT_ARCHITECTURE orderbyAD_DEPARTMENT_UP_LEVEL, AD_DEPARTMENT_CODE) start withAD_DEPARTMENT_CODE ='0' connect by priorAD_DEPARTMENT_CODE = AD_DEPARTMENT_UP_LEVEL;
| |
SELECTAPR_CODE, APR_CODE_UP, NAMES FROM(SELECTA.MEDIA_CODE ||'|'|| A.CHANNEL_CODE ||'|'|| A.COLUMN_CODEASAPR_CODE, A.MEDIA_CODE_UP ||'|'|| A.CHANNEL_CODE_UP ||'|'|| A.COLUMN_CODE_UPASAPR_CODE_UP, DECODE((B.MEDIA_NAME ||'-'|| C.CHANNEL_CODE ||'-'|| D.COLUMN_NAME), '--', '产品关系', (B.MEDIA_NAME ||'|'|| C.CHANNEL_CODE ||'|'|| D.COLUMN_NAME)) NAMES FROMCOLUMNSD, CHANNEL C, MEDIA B, AD_PRODUCT_RELATION A WHEREA.MEDIA_CODE = B.MEDIA_CODE(+) ANDA.MEDIA_CODE = C.MEDIA_CODE(+) ANDA.CHANNEL_CODE = C.CHANNEL_CODE(+) ANDA.MEDIA_CODE = D.MEDIA_CODE(+) ANDA.CHANNEL_CODE = D.CHANNEL_CODE(+) ANDA.COLUMN_CODE = D.COLUMN_CODE(+)) STARTWITHAPR_CODE ='0|0|0' CONNECTBYPRIORAPR_CODE = APR_CODE_UP
这里利用'-'和'|'来进行区分,找出了树状结构的根 为了构建树, (1)先建立了树结构的根,字段这里都设为“0”或者“00” (2)然后再根据需要填充数据 (3)利用上边的oracle的PRIOR,CONNECT_BY_ROOT等进行层次查询 | |
| |
错误原因:在数据库表TRASFER中,TRASFER字段为number类型,而TAPE_NO字段为Varchar2类型。由于在进行父子关系判定中“TRANSFER = TAPE_NO”两者的字段类型不同而导致:ORA-01436
正确语句: SELECTTRANSFER, TAPE_NO, TRANSFER_NAME FROM(SELECTTRANSFER, TAPE_NO, TRANSFER_NAME FROMTRANSFER ORDERBYTAPE_NO, TRANSFER) STARTWITHTRANSFER =0 CONNECTBYPRIORTO_CHAR(TRANSFER)= TAPE_NO | |
|
参考一
PL/SQL基础:阶层查询 作者:itpub cxck 2007-05-08 内容导航: ORACLE 10g新增了阶层查询操作符PRIOR,CONNECT_BY_ROOT SQL>SELECTlast_name, employee_id, manager_id,LEVEL FROMemployees STARTWITHemployee_id=100 CONNECTBYPRIOR employee_id=manager_id ORDERSIBLINGSBYlast_name; LAST_NAME EMPLOYEE_ID MANAGER_IDLEVEL ------------------------- ----------- ---------- ---------- King1001 Cambrault1481002 Bates1721483 Bloom1691483 Fox1701483 Kumar1731483 Ozer1681483 Smith1711483 De Haan1021002 Hunold1031023 Austin 1051034 Ernst1041034 Lorentz1071034 Pataballa1061034 Errazuriz1471002 Ande1661473 Banda1671473
SQL>UPDATEemployeesSETmanager_id=145 WHEREemployee_id=100; SQL>SELECTlast_name "Employee", LEVEL, SYS_CONNECT_BY_PATH(last_name,'/') "Path" FROMemployees WHERElevel<=3ANDdepartment_id=80 STARTWITHlast_name='King' CONNECTBYPRIOR employee_id=manager_idANDLEVEL<=4; 234567ERROR: ORA-01436: CONNECTBYloopinuserdata CONNECTBYNOCYCLE强制返回查询结果。CONNECT_BY_ISCYCLE显示是否存在LOOP。 SQL>SELECTlast_name "Employee", CONNECT_BY_ISCYCLE "Cycle", LEVEL, SYS_CONNECT_BY_PATH(last_name,'/') "Path" FROMemployees WHERElevel<=3ANDdepartment_id=80 STARTWITHlast_name='King' CONNECTBYNOCYCLE PRIOR employee_id=manager_idANDLEVEL<=4; Employee CycleLEVELPath ------------------------- ------ ------ ------------------------- Russell12/King/Russell Tucker03/King/Russell/Tucker Bernstein03/King/Russell/Bernstein Hall03/King/Russell/Hall Olsen03/King/Russell/Olsen Cambrault03/King/Russell/Cambrault Tuvault03/King/Russell/Tuvault Partners02/King/Partners King03/King/Partners/King Sully03/King/Partners/Sully McEwen03/King/Partners/McEwen
SELECTlast_name "Employee", CONNECT_BY_ROOT last_name "Manager", LEVEL-1"Pathlen", SYS_CONNECT_BY_PATH(last_name,'/') "Path" FROMemployees WHERELEVEL>1anddepartment_id=110 CONNECTBYPRIOR employee_id=manager_id; Employee Manager Pathlen Path --------------- ------------ ---------- ----------------------------------- Higgins Kochhar1/Kochhar/Higgins Gietz Kochhar2/Kochhar/Higgins/Gietz Gietz Higgins1/Higgins/Gietz Higgins King2/King/Kochhar/Higgins Gietz King3/King/Kochhar/Higgins/Gietz
SELECTname,SUM(salary) "Total_Salary"FROM( SELECTCONNECT_BY_ROOT last_nameasname, Salary FROMemployees WHEREdepartment_id=110 CONNECTBYPRIOR employee_id=manager_id) GROUPBYname; NAME Total_Salary ------------------------- ------------ Gietz8300 Higgins20300 King20300 Kochhar20300
1
|
参考二
| ||||||||||
| ||||||||||
| ||||||||||
对于oracle进行简单树查询(递归查询)
|