原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章
原始出處 、作者信息和本人聲明。否則將追究法律責任。
作者:永恆の_☆ 地址:http://blog.csdn.net/chenghui0317/article/details/9426759
作者:永恆の_☆ 地址:http://blog.csdn.net/chenghui0317/article/details/9426759
1、使用connect by.. start with... 遞歸查詢
遞歸查詢就是將表中的id 與parentid 關聯起來,建立關聯關係之後oracle幫我們把表中所有滿足條件的信息全部一次性的顯示出來。
sql代碼如下:
/*
connect by :以...爲連接基礎,將id與parentid關聯起來
sj_id = prior sj_parentid:關聯等式,prior 表示以哪個字段設爲優先權限,下面例子表示以parentid爲主,它會一直根據parintid去查找i欄目信息(查找所有id等於這裏的parentid的欄目信息)直到結束,所以肯定會找到根節點
start with :表示以什麼條件開始查找,必須指定
level :表示 這種關係的層級,方便理解
*/
select sj_id,sj_name,sj_parentid,level from tb_subject connect by sj_id = prior sj_parentid start with sj_id =22524
效果圖如下:
另外prior指定的位置不一樣,那麼它查詢的效果也不一樣。
sql代碼如下:
/*
這條語句較上面緊緊 只是prior的位置不同,但效果卻完全不一樣,上面說了prior表示將哪個字段設爲優先權限,上面以parentid爲主,永遠向上查找
而下面以id爲主,表示id享有優先權,那麼它會一直根據id去查找欄目信息(查找所有parentid等於這裏的id的欄目信息)直到結束,所以肯定會找到該欄目下的所有的子節點,以及子節點下的所有子節點信息
*/
select sj_id,sj_name,sj_parentid,level from tb_subject connect by prior sj_id = sj_parentid start with sj_id =22524
效果圖如下:
2、使用rownum 進行分頁查詢
oracle 的分頁不像sql server 一樣,可以使用 top 10 not in (select top 20 ) 這麼方便,oracle 分頁需要用到rownum 僞列來完成。
現在以查詢第11條到20條的條件爲例,目前有兩種實現的方式:
sql 代碼如下:
/*
在子查詢語句中,只有父塊部分才能引用子塊的別名,反之不行。
使用rownum如果直接給予條件rn between 11 and 20,將什麼都不會顯示,因爲rownun查詢的結果返回的第一行永遠是1,如果直接指定爲11,則不滿足顯示情況。
這條語句先查詢所有的欄目信息,然後根據rownum篩選一下,最後使用between ..and ...得到我想要的第11條到20條顯示
*/
select sj_id,sj_name,sj_parentid from(
select s.*,rownum rn from (
select * from tb_subject order by sj_id
) s
) where rn between 11 and 20000;
/*
這條語句先查詢所有的欄目信息,然後根據rownum篩選並過濾前20條信息,最後再使用之前的rownum在過濾一起取出後從第11條開始到結束的信息
*/
select sj_id,sj_name,sj_parentid from(
select s.*,rownum rn from (
select * from tb_subject order by sj_id
) s where rownum <=20000
) where rn >=11
/*
後來反覆執行這兩條語句,甚至加大查詢的數目,這兩條語句在執行的時候幾乎相差不大。查詢時間的差距微乎其微 ,從實際出發來看着兩條魚具不會太影響系統的訪問性能。
No.1 No.2
2.934 2.793
2.73 3.401
2.776 2.918
3.136 2.823
*/
使用他們的效果一樣,都可以達到預期的功能。
後期慢慢整理。