我正在使用具有位置表的数据库,例如:
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是其所有祖先的locationID的csv字符串(考虑层次结构树)。这样,在给定起始位置ID的情况下,在向树顶部工作时,可以轻松确定层次结构。
现在我需要编写代码以从一个祖先开始并递归地查找所有后代。 MySQL有一个名为'find_in_set'的函数,可以轻松解析csv字符串以查找值。这很好,因为我可以说“在设置中找到值4”,这将给出locationID为4的后代的所有位置(包括4本身)。
不幸的是,这是在SQL Server 2014上开发的,它没有这样的功能。 CSV字符串是一个可变长度(允许几乎无限制的级别),我需要一种方法来查找某个位置的所有祖先。
我在互联网上发现的很多模仿find_in_set函数的SQL Server假定了一个固定的层次深度,例如最多4个级别,这对我来说无效。
有没有人有一个存储过程或任何我可以集成到查询中的东西?我真的不必从这个表中提取所有记录来使用代码来单独解析CSV字符串。
我会想象在locationID%或%,{locationid}中搜索locationHierarchy字符串,%会起作用但速度很慢。
答案 0 :(得分:0)
我认为你想要like
- 在任一数据库中。像这样:
select l.*
from locations l
where l.locationHierarchy like @LocationHierarchy + ',%';
如果您想要包含原始位置,那么一种方法是:
select l.*
from locations l
where l.locationHierarchy + ',' like @LocationHierarchy + ',%';
我还应该注意到SQL Server对递归查询有适当的支持,因此除了层次结构树之外,它还有其他层次结构选项(这仍然是一个非常合理的解决方案)。
答案 1 :(得分:0)
最后它对我有用..
SELECT * FROM locations WHERE locationHierarchy like CONCAT(@param,',%%') OR
o.unitnumber like CONCAT('%%,',@param,',%%') OR
o.unitnumber like CONCAT('%%,',@param)