在sql server 2008中生成分层值的任何方法
使用SQL Server,我们需要如下所示的分层数据格式的值在sql server 2008中生成分层值的任何方法,sql,sql-server-2008,Sql,Sql Server 2008,使用SQL Server,我们需要如下所示的分层数据格式的值 1 1.1 1.1.1 1.1.1.1 1.1.1.2 1.1.1.3 1.1.2 1.1.2.1 1.1.2.2 1.1.2.3 1.1.3 1.1.3.1 1.1.3.2 1.1.3.3 1.1.4 1.1.4.1 1.1.4.2 1.1.4.3 1.2 1.2.1 1.2.1.1 1.2.1.2 1.2.1.3 1.2.2 1.2.2.1 1.2.2.2 1.2.2.3 1.2.3 1.2.3.1 1.2.3.2 1.2.3.3
1
1.1
1.1.1
1.1.1.1
1.1.1.2
1.1.1.3
1.1.2
1.1.2.1
1.1.2.2
1.1.2.3
1.1.3
1.1.3.1
1.1.3.2
1.1.3.3
1.1.4
1.1.4.1
1.1.4.2
1.1.4.3
1.2
1.2.1
1.2.1.1
1.2.1.2
1.2.1.3
1.2.2
1.2.2.1
1.2.2.2
1.2.2.3
1.2.3
1.2.3.1
1.2.3.2
1.2.3.3
1.2.4
1.2.4.1
1.2.4.2
1.2.4.3
.
.
1.100.100.100
有人能帮忙吗?SQL Server 2008引入了表示分层数据的。SQL Server 2008引入了表示分层数据的。您没有指定要作为输出的数据类型。我假设您希望字符串按照您在表单1.X.X.X中指定的顺序排列 有几种方法可以实现这一点。紧凑型是将数字0到100交叉连接几次:
;with Numbers (n) as
(
select 0 -- base case: 0
union all
select n + 1 from Numbers where n < 100 -- recursive case: numbers 1 to 100
)
select
cast (LV1.n as varchar) +
case LV2.n when 0 then '' else '.' + cast (LV2.n as varchar) end +
case LV3.n when 0 then '' else '.' + cast (LV3.n as varchar) end +
case LV4.n when 0 then '' else '.' + cast (LV4.n as varchar) end
from Numbers LV1
cross join Numbers LV2
cross join Numbers LV3
cross join Numbers LV4
where
LV1.n = 1
and
(
(LV2.n = 0 and LV3.n = 0 and LV4.n = 0) -- 1.0.0.0 is OK
or (LV2.n <> 0 and LV3.n = 0 and LV4.n = 0) -- 1.X.0.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n = 0) -- 1.X.X.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n <> 0) -- 1.X.X.X is OK
)
order by LV1.n, LV2.n, LV3.n, LV4.n
本例使用递归公共表表达式CTE生成数字0到100。然后,代码将这些数字交叉连接4次,形成一个X.X.X.X的模式
where子句将输出限制为第一个数字为1且零值后没有非零值的所有情况
select将零值转换为空值。所以1.0.0.0被转换成1,1.1.0.0被转换成1.1,等等
在我的开发机器上运行SQL Server 2008 R2 Developer Edition SSMS查询窗口时,它将在3秒内开始返回数据。它在大约15秒钟内返回100万条记录。您没有指定要作为输出的数据类型。我假设您希望字符串按照您在表单1.X.X.X中指定的顺序排列 有几种方法可以实现这一点。紧凑型是将数字0到100交叉连接几次:
;with Numbers (n) as
(
select 0 -- base case: 0
union all
select n + 1 from Numbers where n < 100 -- recursive case: numbers 1 to 100
)
select
cast (LV1.n as varchar) +
case LV2.n when 0 then '' else '.' + cast (LV2.n as varchar) end +
case LV3.n when 0 then '' else '.' + cast (LV3.n as varchar) end +
case LV4.n when 0 then '' else '.' + cast (LV4.n as varchar) end
from Numbers LV1
cross join Numbers LV2
cross join Numbers LV3
cross join Numbers LV4
where
LV1.n = 1
and
(
(LV2.n = 0 and LV3.n = 0 and LV4.n = 0) -- 1.0.0.0 is OK
or (LV2.n <> 0 and LV3.n = 0 and LV4.n = 0) -- 1.X.0.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n = 0) -- 1.X.X.0 is OK
or (LV2.n <> 0 and LV3.n <> 0 and LV4.n <> 0) -- 1.X.X.X is OK
)
order by LV1.n, LV2.n, LV3.n, LV4.n
本例使用递归公共表表达式CTE生成数字0到100。然后,代码将这些数字交叉连接4次,形成一个X.X.X.X的模式
where子句将输出限制为第一个数字为1且零值后没有非零值的所有情况
select将零值转换为空值。所以1.0.0.0被转换成1,1.1.0.0被转换成1.1,等等
在我的开发机器上运行SQL Server 2008 R2 Developer Edition SSMS查询窗口时,它将在3秒内开始返回数据。它在大约15秒内完成了100万条记录的返回。查看递归CTE。您想做什么?您是否有要编号的行?您是否试图按需生成一组标题?输出是什么?是字符串列表,还是每个数字都可以是单独的列?查看递归CTE。您试图做什么?您是否有要编号的行?您是否正在尝试按需生成一组标题?输出结果是什么?是字符串列表,还是每个数字都可以是单独的列?这是一段很棒的代码。很棒,但由于您指定了LV1.n=1,您只返回了约100万行,而不是100万行:-谢谢。我在回答中注意到了这一点。如果只有SMMS查询结果窗口中返回的行单元格有数字分组!这是一段非常棒的代码。非常棒,但是由于您指定了LV1.n=1,您只返回了约1M行,而不是100M行:-谢谢。我在回答中注意到了这一点。如果只有SMMS查询结果窗口中返回的行单元格有数字分组!