il mio luogo di sviluppo...
Oracle mette a disposizione una tipologia di query molto interessante. Permette di creare strutture padre-figlio dicendo al motore database da quale valore partire e quale campo utilizzare per definire la struttura.
Un esempio di query è la seguente:
SELECT campo1
FROM tabella
START WITH campoX = valore
CONNECT BY PRIOR campoX = campoY
Ad esempio, se avessimo la seguente tabella
| campo1 | campoX | campoY |
|---|---|---|
| Verde | 1 | 0 |
| Rosso | 2 | 1 |
| Beige | 3 | 1 |
| Nero | 4 | 0 |
| Bianco | 5 | 1 |
Davvero semplice. La parte iniziale è una select normale, START WITH imposta il valore iniziale del campo, e CONNECT By PRIOR serve, appunto, a dire ad Oracle quali campi utilizzare per definire la struttura, dove CampoX è il padre e CampoY è il figlio.
Se avessimo bisogno di inserire delle condizioni WHERE, sarebbe sufficiente aggiungerle dopo FROM tabella. Se, invece, avessimo bisogno di ordinare i risultati? La cosa è un po' più complicata, aggiungendo un semplice ORDER BY, i risultati verranno ordinati per il campo scelto, ma verrà persa la struttura padre-figlio, dato che Oracle non ne terrà conto nell'ordinamento.
Se volessimo, ad esempio, ordinare i precedenti risultati alfabeticamente, il risultato sarebbe questo:
Beige
Bianco
Nero
Rosso
Verde
Per ovviare a questo problema, basta aggiungere ORDER SIBLINGS BY campoZ alla fine della query:
SELECT campo1, campo2
FROM tabella
START WITH campoX = valore
CONNECT BY PRIOR campoX = campoY
ORDER SIBLINGS BY campoZ
Che dice ad Oracle di ordinare i risultati a seconda del sottolivello in cui si trovano. Adesso il risultato è corretto ed è:
Nero
Verde
Beige
Bianco
Rosso