2010-08-24 26 views
7

względu na prostą strukturę danych:SQL odzyskać strukturę drzewa ładnie

ID | Category_Name | Parent_ID 

Przykład:

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 

Reprezentowanie prosty drzewo struktury nawigacji, co by programowo być najlepszym sposobem, aby pobrać drzewo prezentowalny format? Czy możemy utworzyć instrukcję SQL, aby pobrać je "w kolejności"?

Dzięki za pomoc! Jeśli moje podejście jest złe, nie krępuj się również komentować.

Używam SQL Server 2000.

+0

Co jest platformą bazy danych? Szereg powszechnych rozwiązań SQL jest zależnych od platformy. –

+0

Zaktualizowane pytanie, SQL-Server –

+1

Jaką bazę danych używasz? Jeśli jego MS-SQL 2005 i wyżej, czy spojrzałeś na rekurencyjne CTE? – InSane

Odpowiedz

2

Jeśli używasz programu SQL Server 2008, możesz wypróbować nowy typ danych hierarchyid.

Jeśli nie, to innym sposobem jest zapoznanie się z modelem nested sets, który działa we wszystkich bazach danych.

Jeśli używasz programu SQL Server 2005 i nowszego, możesz użyć recursive CTEs, aby odzyskać strukturę drzewa.

+0

+1 dziękuję za informacje, na SQL 2000 jednak: @) –

+0

wtedy jedynym sposobem jest użycie pętli while, wstaw do tabeli temp i zwróć te z powrotem. Chciałbym zachęcić cię do zaglądania w model zagnieżdżonych zestawów. –

2

zwykle zbudować strukturę drzewa w moim kodu aplikacji. Częściowo dlatego, że jestem bardziej pewny siebie przy pomocy C# niż SQL, ale także dlatego, że zazwyczaj muszę przetworzyć dane do odpowiednich struktur C#.

SQL jest dość zły w strukturach rekursywnych, takich jak listy i drzewa. Gdybym musiał umieścić drzewo w mojej bazie danych, wybrałbym procedurę przechowywaną. Ale może być sprytny sposób, o którym nie wiem.

Jeśli korzystasz z Oracle, możesz zhackować coś za pomocą Connect By.

2

Nie dla SQL2000, ale jeśli uda się uaktualnienie do 2k5, można zrobić

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 
+0

Dzięki, bardzo interesujące! Czy możliwe jest, że w ogóle będzie on rozbity na pracę w SQL 2000? –

+0

Nie, nie bez użycia SP. – erikkallen

Powiązane problemy