oracle用法集锦

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一﹑ORACLE查询树型关系(connect by prior start with)

connect by prior start with 经常会被用到一个表中存在递归关系的时候。比如我们经常会将一个比较复杂的目录树存储到一个表中。或者将一些部门存储到一个表中,而这些部门互相有隶属关系。这个时候你就会用到connect by prior start with。

典型的使用方法就是:

select * from table connect by prior cur_id=parent_id start with cur_id=???

例如:

a b

1 0

2 1

3 1

4 2

5 3

如果想查找a=2及其下面的所有数据,则:

select * from table connect by prior a=b start with a=2

a b

2 1

4 2

例如1﹕

看成兩個集合START WITH 為條件

select *

from dv_boms

WHERE artic_code = '315066-001-00' AND PART_NO='00051'

START WITH artic_code = '315066-001-00' and bom_ver =1

AND ITEM_NO = 60 and item_no_pa is null

CONNECT BY

//以下條件為父主鍵=子主鍵

PRIOR artic_code = artic_code and PRIOR bom_ver = bom_ver and

PRIOR item_no = item_no_pa;

SELECT PART_NO,ITEM_NO,ITEM_NO_PA

FROM DV_BOMS

WHERE Artic_code = '315066-001-00' and bom_ver =1;

AND PART_NO='00051';

從那項開始找到底部關系圖

select *

from dv_boms

START WITH artic_code = '315066-001-00' and bom_ver =1 and item_no_pa ='60'

CONNECT BY

PRIOR artic_code = artic_code and PRIOR bom_ver = bom_ver AND

PRIOR ITEM_NO=ITEM_NO_PA;

例如2﹕

select distinct artic_code,(case when level = 1 then part_no

when level = 2 then ' '||part_no

when level = 3 then ' '||part_no

end ) part_no

此句也可select artic_code, lpad(' ',4*(level-1))||part_no part_no

,item_no,item_no_pa from dv_boms //where artic_code = '313324-002-00'

connect by prior artic_code = artic_code

and prior bom_ver = bom_ver

and prior item_no = item_no_pa

start with artic_code = '315066-001-00'

and bom_ver =1

and PART_NO='00051'

and item_no = 60 ---从某一节点开始

ORDER BY part_no desc

例3﹕

SELECT lpad(' ',3 * level - 2) ,PART_ID ,level

FROM BOM_DETAIL_NEW

WHERE PRODUCT_ID = :ls_proc_id

START WITH PARENT_PART_ID IS NULL

CONNECT BY PRIOR PART_ID = PARENT_PART_ID;

例3﹕

Oracle中使用connect by 来实现树状查询,其中可以使用level这个伪列来实现分层查询。

具体使用如下:

一张表menu记录菜单的层级情况。表结构如下:

menu_id number,

parent_id number,

menu_name nvarchar2(20)

首先select * from menu connect by menu_id = parent_id start with menu_id = 1;

这样可以看到Oracle以树状结构产生结果。某些时候如果我只想要第2层的菜单项如何做呢。select * from

(select level,menu_id,parent_id,menu_name

f rom menu

conncet by menu_id = parent_id

start with menu_id = 1

)

where level = 2

这样就可以得到层级为第二层的菜单项。这样的SQL写法同样适合rownum伪列,Oracle中实现TOP n查询就是如此写的。

二﹑1.查询语句的使用

使用select语句和子查询(subquery)可以从一个或多个表,视图,实体试图中返回数据.

1.1相关子查询

可以将子查询(as subquery)或in或exists当成where的一个条件的一部分,这样的查询称为子查询

.where中可以包含一个select语句的子查询

.where中可以包含in,exists语句

.最多可以嵌套16层

.层次过多会影响性能

[例]简单子查询实例

查询是否有的专家既以研究所的名义来申请基金项目,又以大学系为单位申请项目

(按规定只能以一个单位来申请)

SQL> create table univ_subject

2 (

3 name varchar2(12) not null,

4 per_id number not null,

5 dept_name varchar2(20)

6 );

SQL> insert into univ_subject values('gaoqianjing',1001,'信息工程系');

SQL> insert into univ_subject values('wangbing',1002,'物理系');

相关文档
最新文档