<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    MDA/MDD/TDD/DDD/DDDDDDD
    posts - 536, comments - 111, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    樹的查詢

    Posted on 2007-10-31 21:13 leekiang 閱讀(1830) 評論(0)  編輯  收藏 所屬分類: oracle
    1,查所有的子節點 select? *? from wz_tree???start with?id = 1 connect by prior?id = pid;
    2,查所有的父節點??select? *? from wz_tree???start with?id =?256 connect by prior pid = id;
    ?? 無論正樹還是倒樹, 關鍵就在于connect by的條件.
    ?? 正樹:??必須是??‘父’= prior ‘子’
    ?? 倒樹:??必須是??‘子’= prior ‘父’
    3,查分類的路徑, 用逗號連接:select? sys_connect_by_path(mc, ',') ? from wz_tree???start with?id = 1 connect by prior?id = pid;http://www.itpub.net/838127.html講的很詳細。
    ?? 后注:查某個節點的全路徑,用上面的辦法是先取得所有節點的全路徑的一個臨時結果集,再從這個臨時結果集里查詢某個節點的全路徑,這種辦法太慢了。正確的做法是先查倒樹的全路徑,再取全路徑最大的那條記錄,這樣做速度飛快。sql如下:
    ?? select? max(sys_connect_by_path(mc, ',')) ? from wz_tree???start with?id = ? connect by prior pid = id

    ?? 后注:后來發現一棵15000條記錄的樹,查所有節點的全路徑還是非常快的(0.1秒)。
    ??
    4,查某個表的字段名:
    select max(substr(SYS_CONNECT_BY_PATH(COLUMN_NAME, ','), 2)) col
    ? from (select COLUMN_NAME, column_id
    ????????? from user_tab_columns
    ???????? where table_name = '&TEST')--&為plsqldeveloper里的字符串占位符,執行時會彈出對話框讓你填值
    ?start with column_id = 1
    connect by column_id = rownum;

    5,select? *? from wz_tree?where mc like '%五金'??start with?id = 1 connect by prior?id = pid;
    和select? *? from wz_tree?start with?id = 1 connect by prior?id = pid?and mc like '%五金'?
    二者的查詢結果不一樣.前者正常的先按名稱進行過濾,后者過濾的是樹的分支? 詳見前面的鏈接。

    6,ORA-30004: 使用 SYS_CONNECT_BY_PATH 函數時,不能將分隔符作為列值的一部分。
    ? 這是因為分隔符在列值里出現了。這個在使用oracle的SYS_CONNECT_BY_PATH函數時是禁止的。所以要把分隔符換掉。
    ? 如果出現過以上報錯,換掉分隔符后再次執行含SYS_CONNECT_BY_PATH 函數的sql時可能會報 "ora-00600: 內部錯誤代碼 ,參數:[kokvxsql1],[][],[],..." 。不明白為什么,但重啟oracle就不報錯了。

    7,在oracle10g可以利用偽列函數CONNECT_BY_ISLEAF來判斷當前行是不是葉子,如果是葉子就會在偽列中顯示“1”,如果不是葉子而是一個分支就顯示“0”

    8,sys_connect_by_path除了用于層次關系,還可以用于行列轉換(借助rownum)。
    ? 如把一個表的所有列連成一行,用逗號分隔:
    select max(substr(sys_connect_by_path(column_name,','),2))
    from (select column_name,rownum rn from user_tab_columns where table_name ='DEPT')
    start with rn=1 connect by rn=rownum ;

    -------------查得結果為:
    DEPTNO,DEPTNAME,MGRNO

    參考:
    http://ons.javaeye.com/blog/227113



    主站蜘蛛池模板: 亚洲视频手机在线| 婷婷精品国产亚洲AV麻豆不片| 亚洲国产综合在线| 一级毛片免费观看不卡视频| 亚洲va久久久噜噜噜久久男同| 在线涩涩免费观看国产精品 | 免费国产黄网站在线观看可以下载 | 自拍偷自拍亚洲精品播放| 高清国语自产拍免费视频国产| 亚洲精华国产精华精华液好用| 蜜桃精品免费久久久久影院| 亚洲AV成人无码网站| 国产免费av片在线无码免费看| 苍井空亚洲精品AA片在线播放| 亚洲另类少妇17p| 中文字幕在线观看免费| 久久久久亚洲精品美女| 免费三级毛片电影片| 亚洲国产精品日韩av不卡在线| va亚洲va日韩不卡在线观看| 国产免费播放一区二区| 亚洲欧洲第一a在线观看| 成全高清视频免费观看| 春意影院午夜爽爽爽免费| 亚洲av成人无码久久精品| 少妇高潮太爽了在线观看免费| 亚洲精品无码你懂的| 国产亚洲精品影视在线产品| 亚洲日本在线免费观看| 亚洲欧美日韩综合俺去了| 狠狠亚洲狠狠欧洲2019| 午夜国产精品免费观看| 老司机午夜性生免费福利| 亚洲av无码av制服另类专区| 一个人在线观看视频免费| 二级毛片免费观看全程| 亚洲福利电影在线观看| 亚洲高清国产拍精品青青草原| 日韩精品极品视频在线观看免费| 亚洲最大的成人网| 国产亚洲婷婷香蕉久久精品|