sql >> Databasteknik >  >> RDS >> Oracle

Beräkna procentandelen av roten som ägs av dess föräldrar

I 11g, förmodligen något liknande-

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 .

Eller enligt din '1'|| knep-

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;

Tyvärr i 10g, XMLQuery kan inte acceptera funktioner och förväntar sig alltid en bokstavlig sträng för utvärdering till exempel-

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

fungerar och returnerar 0.25 , men

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

ger ORA-19102: XQuery string literal expected .

Frågan kan bli långsammare när antalet nivåer i ett träd ökar med en extra overhead av internt trädskapande av XMLQuery sig. Den mest optimala metoden för att uppnå resultatet skulle fortfarande vara en PL/SQL-funktion som för övrigt skulle fungera både i 10g och 11g.



  1. Är det mer effektivt att separera stora och små relaterade data i en SQL-tabells kolumn?

  2. spring boot hibernate-fråga ogiltigt användarfel

  3. Hur man installerar PostgreSQL på macOS

  4. Hur får man ett json-objekt som kolumn i postgresql?