Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Дерево в SQL

#дерево #sql


Всем добрый день. У меня появился такой вопрос. Скажем имеется таблица в которой
хранится древовидная структура. Допустим в таблице есть Id - ид записи и IdParent -
ид родителя. Как можно с помощью sql запроса выбрать самого верхнего родителя у записи
с id = 10? Возможно ли вообще такое средствами sql?    


Ответы

Ответ 1



Возможность создания рекурсивных запросов есть начиная с SQL 1999. Это возможно с помощью оператора WITH. В MS Sql будет выглядеть так: WITH rec AS ( SELECT * FROM MyTable WHERE Id = 10 UNION ALL SELECT mt.* FROM MyTable mt JOIN rec p ON mt.parentID = p.id ) SELECT ParentId FROM rec where Id = 10 Если не ошибаюсь, в MySql это работать не будет. Насчет Oracle - не в курсе

Ответ 2



@ReinRaus - вместо NS, я бы посоветовал использовать Materialized path (PostgreSQL Ltree). У NS возникают большие нагрузки при перемещении узла с большим количеством дочерних элементов, так как для каждого элемента необходимо пересчитать левый и правый ключи.

Ответ 3



По стандарту вроде нельзя. Для Oracle, PostgresSQL есть реализация древовидных запросов. В MS sql server'e вроде от версии зависит, в новых вроде появилась возможность но не уверен. По стандарту можно только если костылями со вложенными запросами ограничив по уровню вложенности например так: select * from table as l0 left join table as l1 on(l1.parent_id = l0.id) left join table as l2 on(l2.parent_id = l2.id) left join table as l3 on(l3.parent_id = l1.id) where l0.parent_id is null and (l1.id = 10 or l2.id = 10 or l3.id = 10)

Комментариев нет:

Отправить комментарий