Attraversamento di dati simili ad alberi in un database relazionale mediante SQL


16

Esiste un modo per attraversare i dati dell'albero in SQL? Conosco connect byOracle, ma esiste un altro modo per farlo in altre implementazioni SQL? Sto chiedendo perché l'utilizzo connect byè più semplice della scrittura di un ciclo o di una funzione ricorsiva per eseguire la query per ogni risultato.

Dal momento che alcune persone sembrano essere confuse dalla frase "dati dell'albero", spiegherò ulteriormente: ciò che intendo è per quanto riguarda le tabelle che hanno un parent_idcampo simile o che contiene una chiave primaria di un'altra riga nella stessa tabella.

La domanda nasce da un'esperienza in cui stavo lavorando con i dati archiviati in questo modo in un database Oracle e sapevo che connect bynon era implementato in altri DBMS. Se si dovesse usare SQL standard, si dovrebbe creare un nuovo alias di tabella per ogni genitore che si vorrebbe salire. Questo potrebbe facilmente sfuggire di mano.


Hai le soluzioni di Joe Celko. Pochi esempi: alberi in SQL , alberi e gerarchie in Oracle , modello di set nidificato . Non è necessario avere zucchero di sintassi ;-).
Marian,

Risposte:


14

Il libro di Celko è una buona risorsa, anche se a volte un po 'troppo "accademico".

Ho anche trovato davvero questo metodo , noto come "tabelle di chiusura" per funzionare abbastanza bene.

Se stai utilizzando un database che consente CTE ricorsivi (come PostgreSQL 8.4 o versioni successive o SQL Server 2005 o versioni successive ), sono davvero il modo migliore di procedere. Se sei su Oracle, c'è sempre il venerabile "connect by" .

È la mia esperienza che è molto più comune consegnare un set di tabelle in uno schema di "albero ingenuo" e capire come estrarre l'albero corretto da quella memoria, piuttosto che avere l'opportunità di creare il filtro struttura "tavoli di chiusura".


9

Un CTE ricorsivo sarà la soluzione più semplice. SQL Server 2005 e le versioni attuali di PostgreSQL supportano CTE. Se si utilizza SQL Server 2008 o versione successiva, è possibile utilizzare il HIERARCHYIDtipo di dati. Puoi trovare un buon esempio di questo in HierarchyID: modella le tue gerarchie di dati con SQL Server 2008

Risorse addizionali:


5

In SQL Server (edizioni 2005 e successive) è possibile utilizzare le espressioni di tabella comuni per la lettura delle gerarchie, vedere Esempio di una gerarchia semplice di Microsoft SQL Server 2005 - CTE per un paio di esempi.

Mi è stato raccomandato un libro sull'argomento più in generale che è "Alberi e gerarchie in SQL per Smarties" di Joe Celko, anche se in realtà non ho ancora guardato il libro da solo.


1

Il metodo SQL standard è una "query ricorsiva" fornita dal CTE ricorsivo e designata come WITH [ RECURSIVE ]nella query. L'implementazione non è specificata nelle specifiche, ma solo i metodi resi disponibili per interrogare strutture ricorsive. Nel caso più semplice l'implementazione della struttura dati richiede solo un ID e un ID principale su una riga.

Esistono anche molte soluzioni specifiche per RDBMS: ad esempio PostgreSQL supporta CTE ricorsivi, ma fornisce anche ltreeuna serie diversa di vantaggi e svantaggi nell'implementazione.

Puoi trovare maggiori informazioni su questo sito cercando attraverso il tag della .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.