<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 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    樹(shù)的查詢

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

    ?? 后注:后來(lái)發(fā)現(xiàn)一棵15000條記錄的樹(shù),查所有節(jié)點(diǎn)的全路徑還是非常快的(0.1秒)。
    ??
    4,查某個(gè)表的字段名:
    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里的字符串占位符,執(zhí)行時(shí)會(huì)彈出對(duì)話框讓你填值
    ?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 '%五金'?
    二者的查詢結(jié)果不一樣.前者正常的先按名稱進(jìn)行過(guò)濾,后者過(guò)濾的是樹(shù)的分支? 詳見(jiàn)前面的鏈接。

    6,ORA-30004: 使用 SYS_CONNECT_BY_PATH 函數(shù)時(shí),不能將分隔符作為列值的一部分。
    ? 這是因?yàn)榉指舴诹兄道锍霈F(xiàn)了。這個(gè)在使用oracle的SYS_CONNECT_BY_PATH函數(shù)時(shí)是禁止的。所以要把分隔符換掉。
    ? 如果出現(xiàn)過(guò)以上報(bào)錯(cuò),換掉分隔符后再次執(zhí)行含SYS_CONNECT_BY_PATH 函數(shù)的sql時(shí)可能會(huì)報(bào) "ora-00600: 內(nèi)部錯(cuò)誤代碼 ,參數(shù):[kokvxsql1],[][],[],..." 。不明白為什么,但重啟oracle就不報(bào)錯(cuò)了。

    7,在oracle10g可以利用偽列函數(shù)CONNECT_BY_ISLEAF來(lái)判斷當(dāng)前行是不是葉子,如果是葉子就會(huì)在偽列中顯示“1”,如果不是葉子而是一個(gè)分支就顯示“0”

    8,sys_connect_by_path除了用于層次關(guān)系,還可以用于行列轉(zhuǎn)換(借助rownum)。
    ? 如把一個(gè)表的所有列連成一行,用逗號(hào)分隔:
    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 ;

    -------------查得結(jié)果為:
    DEPTNO,DEPTNAME,MGRNO

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



    主站蜘蛛池模板: 亚洲www77777| 三上悠亚在线观看免费| 久久精品国产亚洲av麻豆图片| 夜夜春亚洲嫩草影院| yy6080亚洲一级理论| 一本久到久久亚洲综合| 凹凸精品视频分类国产品免费| 日韩在线视频线视频免费网站| 无码国模国产在线观看免费| jizz日本免费| 亚洲人成伊人成综合网久久| 亚洲乱亚洲乱少妇无码| 亚洲黄色免费电影| 成年大片免费高清在线看黄| 亚洲日本在线播放| 亚洲国产无套无码av电影| 久久午夜免费鲁丝片| 久久国产亚洲精品| 亚洲人成网亚洲欧洲无码久久| 114级毛片免费观看| 国产偷国产偷亚洲高清人| 亚洲精品在线观看视频| 国产成人亚洲精品91专区手机| 无码人妻AV免费一区二区三区| 亚洲AV无码AV男人的天堂不卡| 狠狠综合久久综合88亚洲| 国产成人免费一区二区三区| 四虎在线成人免费网站| 国产精品免费观看调教网| 中文字幕一区二区免费| 一级毛片免费毛片毛片| 亚洲欧美日韩中文二区| 亚洲另类春色校园小说| 亚洲午夜视频在线观看| 亚洲va久久久噜噜噜久久| 国产美女亚洲精品久久久综合| 国产亚洲人成网站在线观看| 亚洲一区二区高清| 最新亚洲成av人免费看| 亚洲永久无码3D动漫一区| 亚洲成人黄色网址|