oracle跑with语句很慢,oracle 11g新特性---WITH语句增强
--with語句增強,11gR2增強
SQL> select * from test;
ID NAME???????????????? ADDR
---------- -------------------- --------------------
1 wzk????????????????? chengdu
2 cherry?????????????? chengdu
3 wzk????????????????? heilongjiang
4 cherry?????????????? beijing
--with語句增加了別名,但是個數(shù)和順序與as后面的子查詢一一對應(yīng)。
SQL> with c(id,name) as
2? (select id,name,addr from test where id=1 or id=2)
3? select * from c;
(select id,name,addr from test where id=1 or id=2)
*
ERROR at line 2:
ORA-32038: number of WITH clause column names does not match number of elements
in select list
--也可以看出select查詢之后,返回的列名就是我們在with子句中定義的別名。
SQL> with c(no,name,address) as
2? (select id,name,addr from test where id=1 or id=2)
3? select * from c;
NO NAME???????????????? ADDRESS
---------- -------------------- --------------------
1 wzk????????????????? chengdu
2 cherry?????????????? chengdu
--10g允許嗎?可以看見10g是不允許的。
ODS>select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE??? 10.2.0.4.0????? Production
TNS for IBM/AIX RISC System/6000: Version 10.2.0.4.0 - Productio
NLSRTL Version 10.2.0.4.0 - Production
ODS>with c(no,name,address) as
2? (select id,name,addr from test where id=1 or id=2)
3? select * from c;
with c(no,name,address) as
*
第 1 行出現(xiàn)錯誤:
ORA-32033: unsupported column aliasing
ODS>with c(id,name,addr) as
2?? (select id,name,addr from test where id=1 or id=2)
3?? select * from c;
with c(id,name,addr) as
*
第 1 行出現(xiàn)錯誤:
ORA-32033: unsupported column aliasing
--測試with的遞歸查詢
create table employees
(employee_id number,????????? --雇員編號
employee_name varchar2(10),? --雇員名稱
manger_id number,??????????? --經(jīng)理編號
manger_name varchar2(10)???? --經(jīng)理名稱
);
insert into employees values(101,'wzk',100,'www'?? );
insert into employees values(102,'cherry',100,'www');
insert into employees values(103,'hl',101,'wzk'??? );
insert into employees values(104,'hw',101,'wzk'??? );
insert into employees values(105,'dw',103,'hl'???? );
insert into employees values(106,'wy',102,'cherry' );
insert into employees values(107,'ll',105,'dw'???? );
commit;
--統(tǒng)計雇員101下的所有雇員信息。
SQL> with c(eid,ename,mid,mname,lv)
as
(select employee_id,employee_name,manger_id,manger_name,0 lv
from employees
where employee_id=101
union all
select e.employee_id,e.employee_name,e.manger_id,e.manger_name,c.lv+1
from c,employees e
where c.eid=e.manger_id
)
select * from c;
EID ENAME???????????? MID MNAME????????????? LV
---------- ---------- ---------- ---------- ----------
101 wzk?????????????? 100 www???????????????? 0
103 hl??????????????? 101 wzk???????????????? 1
104 hw??????????????? 101 wzk???????????????? 1
105 dw??????????????? 103 hl????????????????? 2
107 ll??????????????? 105 dw????????????????? 3
--看來with可以用來取代connect by子句了啊。呵呵。
--depth是先返回兒子信息,在返回兄弟信息。(先兒子,后兄弟)
--可以看lv列,看lv為1的列。當查到employee_id為103的時候,他下面既有子女,身邊又有兄弟,那么結(jié)果集是先返回兄弟數(shù)據(jù)哪?還是子女數(shù)據(jù)拿?
--searth自動給with語句添加了一列 order1
SQL> with c(eid,ename,mid,mname,lv)
as
(select employee_id,employee_name,manger_id,manger_name,0 lv
from employees
where employee_id=101
union all
select e.employee_id,e.employee_name,e.manger_id,e.manger_name,c.lv+1
from c,employees e
where c.eid=e.manger_id
)
search depth first by ename set order1
select * from c
order by order1;
EID ENAME???????????? MID MNAME????????????? LV???? ORDER1
---------- ---------- ---------- ---------- ---------- ----------
101 wzk?????????????? 100 www???????????????? 0????????? 1
103 hl??????????????? 101 wzk???????????????? 1????????? 2
105 dw??????????????? 103 hl????????????????? 2????????? 3
107 ll??????????????? 105 dw????????????????? 3????????? 4
104 hw??????????????? 101 wzk???????????????? 1????????? 5
--breadth是先返回兄弟信息,后兒子信息(先兄弟,后兒子)
SQL> with c(eid,ename,mid,mname,lv)
as
(select employee_id,employee_name,manger_id,manger_name,0 lv
from employees
where employee_id=101
union all
select e.employee_id,e.employee_name,e.manger_id,e.manger_name,c.lv+1
from c,employees e
where c.eid=e.manger_id
)
search breadth first by ename set order1
select * from c
order by order1;
EID ENAME???????????? MID MNAME????????????? LV???? ORDER1
---------- ---------- ---------- ---------- ---------- ----------
101 wzk?????????????? 100 www???????????????? 0????????? 1
103 hl??????????????? 101 wzk???????????????? 1????????? 2
104 hw??????????????? 101 wzk???????????????? 1????????? 3
105 dw??????????????? 103 hl????????????????? 2????????? 4
107 ll??????????????? 105 dw????????????????? 3????????? 5
總結(jié)
以上是生活随笔為你收集整理的oracle跑with语句很慢,oracle 11g新特性---WITH语句增强的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle lz压缩,LZ:Oracl
- 下一篇: 摩尔庄园手游黄金锦鲤怎么获得?