Обход древовидных данных в реляционной базе данных с использованием SQL

16

Есть ли способ пройти данные дерева в SQL? Я знаю об connect byOracle, но есть ли другой способ сделать это в других реализациях SQL? Я спрашиваю, потому что использовать connect byпроще, чем написать цикл или рекурсивную функцию для запуска запроса для каждого результата.

Поскольку некоторые люди, кажется, смущены фразой «древовидные данные», я объясню далее: я имею в виду то, что касается таблиц, в которых есть parent_idаналогичное поле, содержащее первичный ключ из другой строки в той же таблице.

Вопрос возникает из опыта, когда я работал с данными, хранящимися таким образом в базе данных Oracle, и знал, что они connect byне реализованы в других СУБД. Если бы кто-то использовал стандартный SQL, он должен был бы создать новый псевдоним таблицы для каждого родительского элемента, который нужно увеличить. Это может легко выйти из-под контроля.

indyK1ng
источник
У вас есть решения Джо Селко. Несколько примеров: деревья в SQL , деревья и иерархии в Oracle , модель вложенных множеств . Не обязательно иметь синтаксический сахар ;-).
Marian

Ответы:

14

Книга Селко - хороший ресурс, хотя иногда и слишком «академический».

Я также обнаружил, что этот метод , известный как «закрывающие таблицы», работает достаточно хорошо.

Если вы используете базу данных, которая допускает рекурсивные CTE (такие как PostgreSQL 8.4 или новее , или SQL Server 2005 или новее ), это действительно лучший способ. Если вы находитесь на Oracle, всегда есть почтенное «соединение» .

По моему опыту, гораздо более обычным является вручение набора таблиц в схеме «наивного дерева» и необходимость выяснить, как извлечь правильное дерево из этого хранилища, чем иметь возможность создать уборщик структура "таблицы закрытия".

TML
источник
9

Рекурсивное CTE будет вашим самым простым решением. SQL Server 2005 и текущие версии PostgreSQL поддерживают CTE. Если вы используете SQL Server 2008 или новее, вы можете использовать HIERARCHYIDтип данных. Вы можете найти хороший пример этого на HierarchyID: смоделируйте свои иерархии данных с SQL Server 2008

Дополнительные ресурсы:

Иеремия Пешка
источник
5

В SQL Server (2005 и более поздних выпусках) вы можете использовать общие табличные выражения для чтения иерархий, см. Microsoft SQL Server 2005 - CTE Пример простой иерархии для .

Мне порекомендовали книгу Джо Селко на эту тему «Деревья и иерархии в SQL для умников», хотя я сам пока не смотрел эту книгу.

Дэвид Спиллетт
источник
1

Стандартный метод SQL представляет собой «Рекурсивный запрос», который предоставляется Рекурсивным CTE и обозначается как WITH [ RECURSIVE ] в запросе. Реализация не указана в спецификации, только методы, доступные для структур запросов, которые являются рекурсивными. В простейшем случае реализация структуры данных требует только ID и Parent ID в строке.

Существует также множество специфичных для СУБД решений: например, PostgreSQL поддерживает рекурсивные CTE, но также ltreeпредоставляет и другие преимущества и недостатки в реализации.

Вы можете найти больше информации на этом сайте, выполнив поиск по тегу .

Эван Кэрролл
источник