Avatar billede bhn.314 Nybegynder
02. februar 2004 - 10:37 Der er 7 kommentarer og
1 løsning

get_ancestors (rekursivt) fra hierarki

Jeg har en træstruktur, hvor parent_id refererer til id og derved danner en træstruktur hvor roden af strukturen er NULL, dvs a la:

id  | parent_id
================
100  | NULL
200  | 100
300  | 100
400  | 300
500  | 300
600  | 500
700  | 200
800  | 600

Dvs.:

100
  200
    700
  300
    400
    500
      600
        800

Vi vil hente alle ancestors (alle dem der er under) i hierarkiet ved at sende et id til PL/SQL, dvs. sendes 300 fås alle under den = 400,500,600,800.

Noget a la:

DECLARE
    r tblstructure%ROWTYPE;
    counter BOOLEAN := TRUE;
    nextOne INTEGER;
BEGIN
    nextOne := $1;
    WHILE counter LOOP
        SELECT * INTO r FROM tblstructure WHERE parent_id=nextOne;
        nextOne := r.festivalorganisation_id;
        RETURN NEXT r;
    END LOOP;
        RETURN;
END
'

Er det overhoved muligt at lave det rekursivt ?
Avatar billede ehf Nybegynder
02. februar 2004 - 10:46 #1
Hvorfor ikke lave det med en connect by prior ??

select *
  from tblstructure
connect by prior id = parent_id
start with id = 300
Avatar billede trer Nybegynder
02. februar 2004 - 10:46 #2
Prøv at lege med CONNECT BY PRIOR, du kan lave rekursive kald direkte i SQL på Oracle.

select * from tblstructure
connect by prior id = parent_id
Avatar billede bhn.314 Nybegynder
02. februar 2004 - 10:49 #3
Problemet er at vi ved vi skal skifte DBMS om 6 mdr. så det skal følge SQL98-standarden CONNECT BY er en ORACLE ting. OG JA det er PostgreSQL vi skal skifte til OG JA det er ikke vores valg....
Avatar billede trer Nybegynder
06. februar 2004 - 11:17 #4
I de fleste sprog kan du benytte rekursive kald blot ved at lade en stored procedure eller funktion kalde sig selv.

Men en løsning med en rekursiv procedure/funktion skrevet i PL/SQL vil ikke kunne overholde SQL98 - det vil jo være PL/SQL syntaks.

Derfor skal du i stedet lave din rekursivitet i din klientapplikation - ikke noget problem, men, vil jeg tro, langsommere...
Avatar billede trer Nybegynder
06. februar 2004 - 11:18 #5
Interessant mht skift fra Oracle til PostgreSQL - vil du løfte sløret for begrundelsen?
Avatar billede bhn.314 Nybegynder
11. marts 2004 - 11:34 #6
Økonomi
Avatar billede trer Nybegynder
11. marts 2004 - 11:37 #7
Thja, det kan jo ikke overraske at Postgre er billigere :-)
Avatar billede bhn.314 Nybegynder
17. marts 2004 - 15:50 #8
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester