【问题标题】:Sorting Nestable Structure Index in SQL Server在 SQL Server 中对可嵌套结构索引进行排序
【发布时间】:2019-05-17 13:14:52
【问题描述】:

有一张桌子Article。我想像这样对数据进行排序。

检查记录4.2.1

感谢四位的建议和帮助。

我想对这些数据进行排序:

ArticleCode        
------------
1
1.1
1.2
1.3
2
3
3.1
3.2
3.3
3.4
3.5
4
4.1
4.1.1
4.1.2
4.1.3
4.2
4.2.1
4.2.2
4.2.3
4.2.4
4.2.5
4.2.6
4.2.7
4.2.8
4.2.9
4.2.10
4.2.11
4.2.12

我的选择查询:

select ArticleCode 
from Article 
order by ArticleCode

查询结果:

1
1.1
1.2
1.3
2
3
3.1
3.2
3.3
3.4
3.5
4
4.1
4.1.1
4.1.2
4.1.3
4.2
4.2.1
4.2.10
4.2.11
4.2.12
4.2.2
4.2.3
4.2.4
4.2.5
4.2.6
4.2.7
4.2.8
4.2.9

【问题讨论】:

  • 这是因为您正在对连接的字符串进行排序,而您希望对每个元素进行排序。最好的解决方案是正确规范化这些数据并将这些数据分成三列。这里的数据结构违反了 1NF,将多个数据点塞入单个列中。您是否能够更改数据结构,或者您被卡住并且必须对其进行排序?
  • 补充@SeanLange 所说的,这也不是SQL Server 独有的。如果你把它作为 TEXT 放在 Excel 中,你会得到相同的字符串排序顺序。这与字母 A 之前的字母 a 没有什么不同。
  • 结构不能应用于三列,因为它是动态的。深度可以是无限的。
  • 有没有办法对这类数据进行排序。

标签: sql sql-server sorting nested sql-order-by


【解决方案1】:

这是您可以做到这一点的一种方法。它将支持合理的深度(892 字节),但不是无限的。此外,这在大型数据集上会很慢,但不确定您是否可以通过您拥有的数据结构避免性能问题。

declare @article table(ArticleCode varchar(10))

insert @article values
('1')
, ('1.1')
, ('1.2')
, ('1.3')
, ('2')
, ('3')
, ('3.1')
, ('3.2')
, ('3.3')
, ('3.4')
, ('3.5')
, ('4')
, ('4.1')
, ('4.1.1')
, ('4.1.2')
, ('4.1.3')
, ('4.2')
, ('4.2.1')
, ('4.2.10')
, ('4.2.11')
, ('4.2.12')
, ('4.2.2')
, ('4.2.3')
, ('4.2.4')
, ('4.2.5')
, ('4.2.6')
, ('4.2.7')
, ('4.2.8')
, ('4.2.9')

select *
from @article
order by convert(hierarchyid, '/' + replace(ArticleCode, '.', '/') + '/') --have to append the / before and after so the values are a valid hierarchyid

【讨论】:

  • 感谢您的大力支持。我想我无法避免性能问题。因为有海量数据。但这是一个正确的答案。
猜你喜欢
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 2014-04-09
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多