Есть ли способ пройти данные дерева в SQL? Я знаю об connect by
Oracle, но есть ли другой способ сделать это в других реализациях SQL? Я спрашиваю, потому что использовать connect by
проще, чем написать цикл или рекурсивную функцию для запуска запроса для каждого результата.
Поскольку некоторые люди, кажется, смущены фразой «древовидные данные», я объясню далее: я имею в виду то, что касается таблиц, в которых есть parent_id
аналогичное поле, содержащее первичный ключ из другой строки в той же таблице.
Вопрос возникает из опыта, когда я работал с данными, хранящимися таким образом в базе данных Oracle, и знал, что они connect by
не реализованы в других СУБД. Если бы кто-то использовал стандартный SQL, он должен был бы создать новый псевдоним таблицы для каждого родительского элемента, который нужно увеличить. Это может легко выйти из-под контроля.
источник
Ответы:
Книга Селко - хороший ресурс, хотя иногда и слишком «академический».
Я также обнаружил, что этот метод , известный как «закрывающие таблицы», работает достаточно хорошо.
Если вы используете базу данных, которая допускает рекурсивные CTE (такие как PostgreSQL 8.4 или новее , или SQL Server 2005 или новее ), это действительно лучший способ. Если вы находитесь на Oracle, всегда есть почтенное «соединение» .
По моему опыту, гораздо более обычным является вручение набора таблиц в схеме «наивного дерева» и необходимость выяснить, как извлечь правильное дерево из этого хранилища, чем иметь возможность создать уборщик структура "таблицы закрытия".
источник
Рекурсивное CTE будет вашим самым простым решением. SQL Server 2005 и текущие версии PostgreSQL поддерживают CTE. Если вы используете SQL Server 2008 или новее, вы можете использовать
HIERARCHYID
тип данных. Вы можете найти хороший пример этого на HierarchyID: смоделируйте свои иерархии данных с SQL Server 2008Дополнительные ресурсы:
источник
В SQL Server (2005 и более поздних выпусках) вы можете использовать общие табличные выражения для чтения иерархий, см. Microsoft SQL Server 2005 - CTE Пример простой иерархии для .
Мне порекомендовали книгу Джо Селко на эту тему «Деревья и иерархии в SQL для умников», хотя я сам пока не смотрел эту книгу.
источник
Стандартный метод SQL представляет собой «Рекурсивный запрос», который предоставляется Рекурсивным CTE и обозначается как
WITH [ RECURSIVE ]
в запросе. Реализация не указана в спецификации, только методы, доступные для структур запросов, которые являются рекурсивными. В простейшем случае реализация структуры данных требует только ID и Parent ID в строке.Существует также множество специфичных для СУБД решений: например, PostgreSQL поддерживает рекурсивные CTE, но также
ltree
предоставляет и другие преимущества и недостатки в реализации.Вы можете найти больше информации на этом сайте, выполнив поиск по тегу иерархии .
источник