У меня есть коммерческое приложение с базой данных SQL Server 2008 R2, которая содержит таблицу, которая должна моделировать структуру файлов и папок, аналогичную < root>: < sublevel 1 >: < подуровень 2> .. < подуровень n>: < документ>. Таблица базы данных содержит пары значений (folder_item, parent), где папка - это документ или папка, а родитель - ссылка на другую строку в таблице.Рекурсивный иерархический запрос SQL Server, менее оптимальная структура данных
Я пытаюсь написать запрос, который возвращает два значения в ряд:
- документ
- Полный сцепленных путь к документу, из папки верхнего уровня к немедленному контейнеру документа, например Root: Level1: Level2 ..: LevelN.
Обычно рекурсивный запрос должен иметь возможность справиться с этой ситуацией, но есть осложнение. Таблица элементов папок содержит избыточные записи для каждого документа и подуровня, связывая их с каждым предком в структуре папок, а не только с их непосредственным родителем.
Вместо (документ, родитель) (родитель, бабушка или дедушка) (прародитель, пра-дедушка) ... (предок, корень)
Таблица содержит (документ, родитель) (документ, прародитель) ... (документ, предок) (документ, корень) (родитель, бабушка или дедушка) ... (родитель, предок) (родитель, корень) ... (grandparent, grand-grandparent) ... (grandparent, root)
и так далее. Я уверен, что модельеры данных имеют свои причины для разработки, но это отрицает использование стандартного рекурсивного иерархического запроса. Фактически, когда я пытался, выполнение превысило максимальное количество уровней рекурсии.
Кто-нибудь еще сталкивался с подобной проблемой и может ли она быть решена без применения сложного программирования за пределами стандартных возможностей SQL?
Спасибо большое
Патрик
Как насчет отправки некоторых структур таблиц и выборочных данных? Если вы просто основываете свою рекурсию на имени, вы, вероятно, сражаетесь с проигранной битвой. –
Рекурсия основана на уникальном, но не PK VARCHAR значении «DOCNUMBER», где столбец PARENT содержит DOCNUMBER строки предка. –
К счастью, выяснилось, что было принято решение игнорировать существующую иерархию Папок, и проблема исчезла из-за (разумного) бизнес-решения за один раз. Спасибо Шон и Табу за ответ. –