0

我正在使用具有位置表的数据库,例如:

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 字符串(想想层次结构树)。在给定起始 locationID 的情况下,当朝着树的顶部工作时,这使得确定层次结构变得容易。

现在我需要编写代码以从祖先开始并递归查找所有后代。MySQL 有一个名为“find_in_set”的函数,它可以轻松解析 csv 字符串以查找值。这很好,因为我可以说“在集合中查找值 4”,这将给出所有 locationID 为 4 的后代的位置(包括 4 本身)。

不幸的是,这是在 SQL Server 2014 上开发的,它没有这样的功能。CSV 字符串是可变长度(几乎允许无限级别),我需要一种方法来查找某个位置的所有祖先。

我在 Internet 上找到的很多将 find_in_set 函数模拟到 SQL Server 中的内容都假定层次结构的固定深度(例如最多 4 级)对我不起作用。

有没有人有存储过程或任何我可以集成到查询中的东西?我真的不想从这个表中提取所有记录来使用代码来单独解析 CSV 字符串。

我想在 locationHierarchy 字符串中搜索 locationID% 或 %,{locationid},% 会起作用,但速度很慢。

4

2 回答 2

0

我认为您想要like- 在任一数据库中。像这样的东西:

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

如果您想要包含原始位置,那么一种方法是:

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

我还应该注意,SQL Server 对递归查询有适当的支持,因此除了层次结构树之外,它还有其他层次结构选项(这仍然是一个非常合理的解决方案)。

于 2016-03-01T14:37:53.273 回答
0

最后它对我有用..

SELECT * FROM locations WHERE locationHierarchy like CONCAT(@param,',%%')    OR
                                    o.unitnumber like CONCAT('%%,',@param,',%%') OR
                                    o.unitnumber like CONCAT('%%,',@param)
于 2018-05-09T07:45:29.193 回答