Oracle 中的树查询和 connect by
Oracle 中的树查询和 connect by
使用 connect by 和 start with 来建立类似于树的报表并不难,只要遵循以下基本原则即可:
使用 connect by 时各子句的顺序应为:
select
from
where
start with
connect by
order by
prior 使报表的顺序为从根到叶(如果 prior 列是父辈)或从叶到根(如果 prior 列是后代)。
where 子句可以从树中排除个体,但不排除它们的子孙(或者祖先,如果 prior 列是后代)。
connect by 中的条件(尤其是不等于)消除个体和它所有的子孙(或祖先,依赖于怎样跟踪树)。
connect by 不能与 where 子句中的表连接在一起使用。
下面是几个例子
1. 从根到叶遍历
SELECT n_parendid, n_name, (LEVEL - 1), n_id
from navigation
WHERE n_parendid IS NOT NULL
START WITH n_id = 0
CONNECT BY n_parendid = PRIOR n_id;
2. 从叶到根遍历
SELECT n_parendid, n_name, (LEVEL - 1), n_id
from navigation
WHERE n_parendid IS NOT NULL
START WITH n_id = 300
CONNECT BY n_id = PRIOR n_parendid;
3. 排除个体,但不排除它们的子孙
SELECT n_parendid, n_name, (LEVEL - 1), n_id
from navigation
WHERE n_parendid IS NOT NULL AND n_id != 2
START WITH n_id = 0
CONNECT BY n_parendid = PRIOR n_id;
4. 消除个体和它所有的子孙
SELECT n_parendid, n_name, (LEVEL - 1), n_id
from navigation
WHERE n_parendid IS NOT NULL
START WITH n_id = 0
CONNECT BY n_parendid = PRIOR n_id AND n_id != 2;
5. 改变显示顺序
SELECT n_parendid, n_name, (LEVEL - 1), n_id
from navigation
WHERE n_parendid IS NOT NULL
START WITH n_id = 0
CONNECT BY n_parendid = PRIOR n_id
ORDER BY n_viewnum DESC;
本文转自csdn:http://blog.csdn.net/wzy0623/archive/2007/06/18/1656345.aspx
相关文档:
自己刚开始用PL/SQL来写一点东西,现在还肤浅的很,说这些不是想谦虚,而是想如果有高手看到自己有什么地方写错的,希望给我一点指点。
今天下午找了一下午自己的那个PL/SQL包的错误,最后还是解决了。。。两个小的不能再小的问题,和大家分享一下。
1、在PL/SQL中如果是函数,就可以SQL语句中使用,也可以在其他的PL/SQL ......
一 登录SQLPLUS
sqlplus用户名/密码@数据库实例as登录角色;
如:用户sys(密码为123)以sysdba的角色登录数据库ORACL,我们可以输入:sqlplus sys/123@oracl as sysdba;
这种登录方式会直接暴露密码,如果想隐藏密码,可以在此省略密码的输入,如:sqlplus sys@oracl as sysdb ......
update customers a
set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id)
where exists (select 1
from ......
oracle做查询语句的时候,类似select id in (xxxx,xxxx.....)这样的语句最大只支持2000个值,如果对应得值上万行,如该如何处理了。
这时候应该采用临时表。建一个临时表,把数据导入进去。查询时候联表查询既可。(以上是我工作中遇到的一个需求) ......