Я работаю с базой данных, содержащей таблицу мест, таких как:SQL Server 2014 эквивалентен FIND_IN_SET в MySQL()
locationID | locationHierarchy
1 | 0
2 | 1
3 | 1,2
4 | 1
5 | 1,4
6 | 1,4,5
, что делает дерево, как этот
1
--2
----3
--4
----5
------6
где locationHierarchy является строка csv идентификаторов location всех своих предков (подумайте о дереве иерархии). Это позволяет легко определить иерархию при работе над вершиной дерева с учетом исходного идентификатора местоположения.
Теперь мне нужно написать код, чтобы начать с предка и рекурсивно найти всех потомков. MySQL имеет функцию «find_in_set», которая легко анализирует строку csv для поиска значения. Это хорошо, потому что я могу просто сказать «найти в наборе значение 4», которое даст все местоположения, которые являются потомками locationID 4 (включая 4 себя).
К сожалению, это разрабатывается на SQL Server 2014 и не имеет такой функции. Строка CSV представляет собой переменную длину (допускается практически неограниченный уровень), и мне нужен способ найти всех предков местоположения.
Многие из того, что я нашел в Интернете, чтобы имитировать функцию find_in_set в SQL Server, предполагают фиксированную глубину иерархии, такую как максимум 4 уровня), которая не будет работать для меня.
У кого-нибудь есть хранимая процедура или что-нибудь, что я мог бы интегрировать в запрос? Мне бы действительно не пришлось вытаскивать все записи из этой таблицы, чтобы использовать код для индивидуального анализа строки CSV.
Я бы предположил, что поиск строки locationHierarchy для locationID% или%, {locationid},% будет работать, но будет довольно медленным.
Можете привести примеры желаемых результатов. –
Если возможно, я бы предложил изменить структуру данных. Существует несколько примеров хранения иерархических данных. Если это не вариант, то ваш последний комментарий, вероятно, является самым простым решением, использующим 'like' ... – sgeddes
SQL Server имеет специальный тип данных для такого типа структуры данных:' hierarchyid', который, вероятно, является лучшим выбором, тогда «CSV column ": https://msdn.microsoft.com/en-us/library/bb677173%28v=sql.110%29.aspx –