2016-03-01 2 views
0

Я работаю с базой данных, содержащей таблицу мест, таких как: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},% будет работать, но будет довольно медленным.

+0

Можете привести примеры желаемых результатов. –

+0

Если возможно, я бы предложил изменить структуру данных. Существует несколько примеров хранения иерархических данных. Если это не вариант, то ваш последний комментарий, вероятно, является самым простым решением, использующим 'like' ... – sgeddes

+0

SQL Server имеет специальный тип данных для такого типа структуры данных:' hierarchyid', который, вероятно, является лучшим выбором, тогда «CSV column ": https://msdn.microsoft.com/en-us/library/bb677173%28v=sql.110%29.aspx –

ответ

0

Я думаю, вы хотите like - в любой базе данных. Что-то вроде этого:

select l.* 
from locations l 
where l.locationHierarchy like @LocationHierarchy + ',%'; 

Если вы хотите исходное местоположение включено, то один метод:

select l.* 
from locations l 
where l.locationHierarchy + ',' like @LocationHierarchy + ',%'; 

Следует также отметить, что SQL Server имеет надлежащую поддержку для рекурсивных запросов, поэтому у него есть другие варианты для иерархии, кроме деревьев иерархии (которые все еще являются очень разумным решением).