SQL для извлечения древовидной структуры - PullRequest
7 голосов
/ 24 августа 2010

Учитывая простую структуру данных:

ID    |    Category_Name    |    Parent_ID

Пример:

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

Представляя простую древовидную структуру навигации, какой программно будет лучший способ получить дерево в презентабельном формате? Можем ли мы создать оператор SQL, чтобы получить их «по порядку»?

Спасибо за любую помощь! Если мой подход неверен, не стесняйтесь комментировать.

Я использую SQL-Server 2000.

Ответы [ 3 ]

2 голосов
/ 24 августа 2010

Если вы используете SQL Server 2008, вы можете попробовать новый тип данных ierarchyid .

Если нет, то можно посмотреть на модель вложенных множеств , которая работает во всех базах данных.

Если вы используете SQL Server 2005 и выше, вы можете использовать рекурсивные CTE для получения древовидной структуры.

2 голосов
/ 24 августа 2010

Не для SQL2000, но если вам удастся обновить до 2k5, вы можете сделать

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
2 голосов
/ 24 августа 2010

Я обычно строю древовидную структуру в своем коде приложения.Частично потому, что я более уверен в c #, чем в SQL, но также потому, что мне все равно нужно обрабатывать данные в подходящие структуры c #.

SQL довольно плох в рекурсивных структурах, таких как списки и деревья.Если бы мне пришлось поместить здание дерева в моей базе данных, я бы пошел на хранимую процедуру.Но, возможно, есть умный способ, о котором я не знаю.

Если вы используете Oracle, вы можете взломать что-то с помощью Connect By .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...