Oracle
 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 Fiddle .

Или според вашия '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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL актуализация въз основа на подзаявка между две таблици

  2. oracle Изберете дати за артикули, продадени в рамките на 1 минута един от друг

  3. Oracle сравнява две различни дати

  4. Оператор на въртене на Oracle

  5. SQL ред по елементи от IN клауза