帮助t-sql查询

时间:2010-04-27 21:28:03

标签: sql sql-server sql-server-2005 tsql

基于下表

Path
----------------------
area1
area1\area2
area1\area2\area3
area1\area2\area3\area4
area1\area2\area5
area1\area2\area6
area1\area7

我的存储过程的输入是areapath和no.of children(表示需要从输入isapath考虑的深度)

areapath = AREA1
孩子= 2

上面应该给出

Path
-----------
area1
area1\area2
area1\area2\area3
area1\area2\area5
area1\area2\area6
area1\area7

类似于 areapath = area2和children = 1输出应

Path
---------------
area1\area2
area1\area2\area3
area1\area2\area5
area1\area2\area6

我很困惑如何为这个写一个查询。

3 个答案:

答案 0 :(得分:1)

嗯......看起来这是您学习开始规范化数据的部分。如果您只是将树存储为树,那将是微不足道的。

话虽这么说,你可以用一些花哨的字符串拆分和解析来解决这个问题。

您需要一个UDF,它将包含斜杠的行拆分为一个标记数组。 TSQL没有内置函数来执行此操作,也没有数组的概念,因此您需要稍微捏一下并使用临时表。

然后,只需将该数组中的[children]条目与WHERE子句中提供的[areapath]进行比较即可。

答案 1 :(得分:0)

我同意Jason的观点,但请记住,您可以使用VB.NET/C#编写分割函数,然后通过CLR导入功能将其引入SQL Server。当然,这假设您在服务器上拥有适当的授权来执行此操作。虽然SQL对很多东西都很好,但它没有像其他语言那样强大的字符串操作工具。

答案 2 :(得分:0)

我想这不是一个功课。

create table #Tt([path] varchar(255))
insert #tt values( 'area1')
insert #tt values( 'area1\area2')
insert #tt values( 'area1\area2\area3')
insert #tt values( 'area1\area2\area3\area4')
insert #tt values( 'area1\area2\area5')
insert #tt values( 'area1\area2\area6')
insert #tt values( 'area1\area7')

select * from  #tt where len([path])-len(replace([path],'\','')) = 2 and [path] like 'area1\%'

drop table #tt