sql >> Database >  >> RDS >> Oracle

Bereken het percentage van de wortel dat eigendom is van de ouders

In 11g, waarschijnlijk zoiets als-

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 .

Of, volgens uw '1'|| truc-

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;

Helaas in 10g, XMLQuery kan geen functies accepteren en verwacht altijd een letterlijke tekenreeks voor bijvoorbeeld evaluatie-

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

werkt en retourneert 0.25 , maar

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

geeft ORA-19102: XQuery string literal expected .

De query kan langzamer worden naarmate het aantal niveaus in een boomstructuur toeneemt met extra overhead voor het maken van een interne boomstructuur door XMLQuery zelf. De meest optimale methode om het resultaat te bereiken zou nog steeds een PL/SQL-functie zijn die trouwens zowel in 10g als 11g zou werken.



  1. SQL gebruikt door komma's gescheiden waarden met IN-clausule

  2. Haal N aantal records uit de onderliggende tabel voor elke bovenliggende record in een MySQL-weergave

  3. Is er een manier om een ​​functie tussen MySQL-databases te kopiëren?

  4. Mysql/Php - Huidige datum en tijd