#дерево #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)
Комментариев нет:
Отправить комментарий