2

我正在尝试编写一个查询,该查询将返回表中最接近的匹配项。该表表示一个层次结构,如下所示:

Hier_Code Group1 Group2 Group3
_________ ______ ______ ______
A         1      1      5 
AA        1      2      5
AAA       1      2      5
AAB       1      3      5
AB        2      3      5
ABA       2      3      5
ABB       2      3      5

我正在搜索的值可能不完全匹配,在这种情况下,我希望它们“汇总”到下一个级别以找到匹配项。例如:

Value     Returns:  
A         1      1      5 (Perfect match)
AAC       1      2      5 (AA is closest)
AABB      1      3      5 (AAB is closest)

这个想法是,您将一次从搜索词中删除一个字符,直到找到匹配项。我试过用递归 CTE 做这个,也用 WHILE 循环无济于事。

有什么建议么?

提前致谢

4

2 回答 2

2

试试这个:

SELECT top 1 Group1, Group2, Group3 
FROM temp 
WHERE 'AABB' like Hier_Code + '%'
GROUP BY Group1, Group2, Group3
ORDER BY MAX(len(Hier_Code)) desc
于 2012-06-14T18:17:39.727 回答
0

这是一个启动器,您可以使用它来创建一些动态 SQL:

           select id from t
           where g1 = 1 and g2 = 1 and g3 = 5

           union

           select id from t
           where g1 = 1 and g2 = 1 

           union

           select id from t
           where g1 = 1 

UNION 的默认行为是消除重复,这样在这三个 select 执行后,结果集中不会出现超过一次的 id。

问题是有几种排列:

         {g1, g2, g3}, {g1, g3},  {g1, g2}, {g2, g3}

所以你不能像我在我的例子中那样简单地去掉最后的条件。

于 2012-06-14T18:12:53.813 回答