sql >> データベース >  >> RDS >> Oracle

親が所有するルートの割合を計算します

    11gでは、おそらく次のようなものです-

    SELECT a.*, LEVEL AS lvl
          ,XMLQuery( substr( sys_connect_by_path( percent_owned, '*' ), 2 ) RETURNING CONTENT).getnumberval() AS calc
       FROM hierarchy_test a
      START WITH id = 1
    CONNECT BY nocycle PRIOR parent_id = id;
    

    SQLフィドル

    または、'1'||に従って トリック-

    SELECT a.*, LEVEL AS lvl
          , XMLQuery( ('1'|| sys_connect_by_path( percent_owned, '*' )) RETURNING CONTENT).getnumberval() AS calc
       FROM hierarchy_test a
      START WITH id = 1
    CONNECT BY nocycle PRIOR parent_id = id;
    

    残念ながら10gでは、XMLQuery 関数を受け入れることができず、たとえば評価のために常に文字列リテラルを期待します-

    select XMLQuery('1*0.25' RETURNING CONTENT).getnumberval() as val 
      from dual;
    

    動作し、0.25を返します 、しかし

    select XMLQuery(substr('*1*0.25',2) RETURNING CONTENT).getnumberval() as val
       from dual;
    

    ORA-19102: XQuery string literal expected

    XMLQueryによる内部ツリー作成の追加のオーバーヘッドにより、ツリーのレベル数が増えると、クエリが遅くなる可能性があります。 自体。結果を達成するための最適な方法は、PL / SQL関数であり、ちなみに10gと11gの両方で機能します。



    1. 英語以外の文字を保存し、「?????」を取得しました-MySQL文字セットの問題

    2. いくつかの結果SQLフィールドを共通のオブジェクトにグループ化する

    3. mysqlトランザクションエラー処理

    4. PHP-mysqlに日付を挿入します