日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

oracle跑with语句很慢,oracle 11g新特性---WITH语句增强

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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語句增加了別名,但是個數和順序與as后面的子查詢一一對應。

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 行出現錯誤:

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 行出現錯誤:

ORA-32033: unsupported column aliasing

--測試with的遞歸查詢

create table employees

(employee_id number,????????? --雇員編號

employee_name varchar2(10),? --雇員名稱

manger_id number,??????????? --經理編號

manger_name varchar2(10)???? --經理名稱

);

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;

--統計雇員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的時候,他下面既有子女,身邊又有兄弟,那么結果集是先返回兄弟數據哪?還是子女數據拿?

--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

總結

以上是生活随笔為你收集整理的oracle跑with语句很慢,oracle 11g新特性---WITH语句增强的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。