sql >> Database teknologi >  >> RDS >> Oracle

Beregn procentdelen af ​​roden, der ejes af dens forældre

I 11g, Sandsynligvis noget lignende-

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 i henhold til din '1'|| trick-

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;

Desværre i 10g, XMLQuery kan ikke acceptere funktioner og forventer altid en streng bogstavelig til evaluering for eksempel-

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

virker og returnerer 0.25 , men

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

giver ORA-19102: XQuery string literal expected .

Forespørgslen kan blive langsommere, efterhånden som antallet af niveauer i et træ stiger med en ekstra overhead af intern træoprettelse af XMLQuery sig selv. Den mest optimale metode til at opnå resultatet ville stadig være en PL/SQL-funktion, som i øvrigt ville fungere både i 10g og 11g.



  1. connection.query(...).then er ikke en funktion

  2. Hvordan vil en underordnet klassekonstruktør interagere med en overordnet klassekonstruktør i php?

  3. Kan PDO-metoder fejle og ikke kaste PDOException?

  4. MySQL Sum flere kolonneværdier med betingelser