sql >> Databáze >  >> RDS >> Oracle

Vypočítejte procento kořene vlastněného jeho rodiči

V 11g, pravděpodobně něco jako-

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 .

Nebo podle vašeho '1'|| trik-

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;

Bohužel v 10g, XMLQuery nemůže přijímat funkce a vždy očekává řetězcový literál pro vyhodnocení například-

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

funguje a vrací 0.25 , ale

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

dává ORA-19102: XQuery string literal expected .

Dotaz se může zpomalit, protože se zvyšuje počet úrovní ve stromu s další režií na vytváření interního stromu pomocí XMLQuery sám. Nejoptimálnější metodou k dosažení výsledku by stále byla funkce PL/SQL, která by mimochodem fungovala jak v 10g, tak 11g.



  1. Získejte záznamy za aktuální měsíc

  2. MySQL UNIX_TIMESTAMP pro PostgreSQL

  3. Jak můžeme v PostgreSQL zjistit, zda je každý index tabulky seskupený nebo ne?

  4. Vložit hodnoty z tabulky A do tabulky A