SQL per recuperare la struttura ad albero bene



sql-server database-design (3)

Generalmente creo la struttura ad albero nel mio codice applicazione. In parte perché sono più sicuro di c # rispetto a SQL, ma anche perché di solito ho bisogno di elaborare i dati in strutture c # adeguate.

SQL è piuttosto cattivo in strutture ricorsive come liste e alberi. Se dovessi inserire la struttura ad albero nel mio database, andrei a cercare una stored procedure. Ma potrebbe esserci un modo intelligente di cui non so nulla.

Se usi Oracle potresti essere in grado di modificare qualcosa con Connect By .

Data la semplice struttura dati:

ID    |    Category_Name    |    Parent_ID

Esempio:

1          Cars                    0
2          Boxes                   0
3          Lamborghinis            1
4          VW Camper Vans          1
5          Big Boxes               2
6          Small Boxes             2
7          Cereal Boxes            2
8          Broken Lambos           3
9          Yellow Ones             3
10         Rusty                   8
11         Milkshake Stained       8
12         Chocolate Flavour       11
13         Strawberry              11
14         Indiscernible Solution  11

Rappresentando una semplice struttura di navigazione dell'albero, quale sarebbe il modo migliore per recuperare l'albero in un formato presentabile? Possiamo creare un'istruzione SQL per recuperarli "in ordine"?

Grazie per qualsiasi aiuto! Se il mio approccio è sbagliato, sentiti libero di commentare anche.

Sto usando SQL-Server 2000.


Answer #1

Non per SQL2000, ma se riesci ad aggiornare a 2k5, puoi farlo

WITH t AS(SELECT id, parent_id, category_name FROM mytable WHERE parent_id IS NULL
          UNION ALL
          SELECT c.id, c.parent_id, c.category_name FROM t p JOIN mytable c ON c.parent_id = p.id)
SELECT * FROM t

Answer #2

Se si utilizza SQL Server 2008, è possibile provare il nuovo tipo di dati gerarchico .

Se non lo sei, un altro modo è di esaminare il modello di insiemi nidificati che funziona su tutti i database.

Se si utilizza SQL Server 2005 e versioni successive, è possibile utilizzare CTE ricorsive per recuperare la struttura ad albero.





tree