2012-12-01 8 views
5

Ora è possibile estrarre i dati, ma mi chiedo se esiste un modo migliore per ottimizzare la query per i set di dati di grandi dimensioni.La query gerarchica deve estrarre i figli, i genitori ei fratelli

http://sqlfiddle.com/#!4/0ef0c/5

Quindi, fondamentalmente voglio essere in grado di fornire la query un dato org id e farlo in modo ricorsivo tirare i suoi genitori, i suoi figli, i suoi fratelli e le sue zie e zii. E quindi estrarre qualsiasi Attività associata a quella gerarchia organizzativa.

Org1 è l'org di livello superiore, ma può avere o meno un genitore nullo.

Fondamentalmente stavo facendo una query su e giù per tirare i figli e il genitore, ma posso solo sembrare di ottenere i fratelli aggiungendo un'altra query. Finalmente ho ottenuto un'altra query con l'aiuto di un amico, ma è molto bassa su set di dati di grandi dimensioni (4-5k di attività).

Qualsiasi intuizione sarebbe molto apprezzata.

+0

Se ti sei preso la briga di creare un violino, un collegamento sarebbe utile. – Laurence

+0

Mi dispiace per quello. http://sqlfiddle.com/#!4/5310d/5/0 –

+0

Ya, aiuta a essere chiari. Di conseguenza, questa è la terza volta che aggiungi nuove informazioni a ciò che desideri. Dimenticalo. – REW

risposta

0

Se la vostra organizzazione. la struttura è strettamente gerarchica, quindi è possibile utilizzare questo approccio: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

Lo svantaggio è che è necessario aggiornare l'indice su ogni aggiornamento della struttura organizzativa. Tuttavia le strutture org vengono solitamente lette molto più spesso e poi modificate. Quindi IMHO questo dovrebbe fare il trucco.

0

La chiave per fare ciò è nella parola "ricorsivamente". Per fare ciò, crea una procedura che chiama se stessa. Questo è un esempio per i genitori, ma poiché sta usando un cursore per scorrere le voci, dovrebbe essere semplice per come usare questo per trovare i bambini e le altre relazioni che coinvolgono la ricorsione.

CREATE OR REPLACE PROCEDURE find_parents( 
    org_id NUMBER, 
    lvl NUMBER DEFAULT 1) AS 

    c_parent table1.id%TYPE; 
    c_name table1.name%TYPE; 
    CURSOR c_parents (c_id table1.id%TYPE) IS 
    SELECT parent, name FROM table1 WHERE (id = c_id); 

    BEGIN 
    dbms_output.put('-'); 
    OPEN c_parents(org_id); 
    LOOP 
     FETCH c_parents INTO c_parent, c_name; 
     EXIT WHEN c_parents%notfound; 
     dbms_output.put_line('Level ' || lvl || ' parent: [ID: ' || c_parent || ', NAME: ' || c_name || ']'); 
     find_parents(c_parent, lvl + 1); 
    END LOOP; 
    CLOSE c_parents; 
    END; 
+0

Questo dovrebbe essere fattibile in una normale query gerarchica - nessuna procedura necessaria. –

Problemi correlati