【问题标题】:Sorting Table in hierarchical order按层次顺序排序表
【发布时间】:2019-10-04 08:49:20
【问题描述】:

是否可以像这样按层次顺序对查询表进行排序:

预期

+----+--------+-----------+-------+--------+-----------+-----------+---------+
| ID | Code   |  Name     | Qty   | Amount | is_parent | parent_id | remarks |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 1  | ABC    | Parent1   |  2    | 1,000  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 4  | FFLK   | Product Z |  10   | 2,500  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 5  | P6DT   | Product 5 |  7    | 1,700  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 6  | P2GL   | Product T |  5    | 1,100  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 2  | DHG    | Parent2   |  5    | 1,500  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 3  | LMSJ   | Product U |  4    | 600    |     0     |     2     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+

这是原始数据表:

+----+--------+-----------+-------+--------+-----------+-----------+---------+
| ID | Code   |  Name     | Qty   | Amount | is_parent | parent_id | remarks |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 1  | ABC    | Parent1   |  2    | 1,000  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 2  | DHG    | Parent2   |  5    | 1,500  |     1     |     0     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 3  | LMSJ   | Product U |  4    | 600    |     0     |     2     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 4  | FFLK   | Product Z |  10   | 2,500  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 5  | P6DT   | Product 5 |  7    | 1,700  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+
| 6  | P2GL   | Product T |  5    | 1,100  |     0     |     1     | xxx     |
+----+--------+-----------+-------+--------+-----------+-----------+---------+


is_parent column = 1 if data row set to parent, 0 if data row set to child 
parent_id column = 0 if data row set to parent, depend on ID of parent data

我正在使用 SQL Server 生成数据。

【问题讨论】:

  • 解释不清楚。虽然结果看起来像一个分层顺序,但如果键具有可排序格式,则可以使用简单的ORDER BY Code 来实现 - 您必须确保 ID 值由相同数量的数字表示,并在需要时用 0 填充.
  • @PanagiotisKanavos 如果代码有随机字符串怎么办?
  • 更好的选择是将Code 替换为hierarchyid 字段。 hierarchyid 是一个二进制值,其内容反映了层次结构,可以进行排序索引。
  • 你想从什么开始?解释不清楚。结果显示分层排序。现在Code 似乎是层次结构的关键。也许真正的 问题是如何遍历层次结构?添加hierarchyid 字段或使用a recursive CTE。 hierarchyid 是一种更快的解决方案。
  • 检查Lesson 1: Converting a Table to a Hierarchical StructurePopulate 部分包含一个递归查询,该查询遵循层次结构深度优先以生成新的 hierarchyid 值。

标签: sql-server sorting hierarchical-data hierarchical-query


【解决方案1】:

看起来实际的问题是如何按层次顺序查询数据。这可以使用recursive queries 实现,但更快的替代方法是使用SQL Server 对hierarchical data 的支持。

以分层顺序返回数据的递归查询如下所示:

WITH h AS
(
      SELECT
             ID,Code,Name,Qty,Amount,is_parent,parent_id,remarks
      FROM
            dbo.ThatTable
      WHERE 
            parent_id=0
      UNION ALL 
      SELECT
             c.ID,c.Code,c.Name,c.Qty,c.Amount,c.is_parent,c.parent_id,c.remarks
      FROM
            dbo.ThatTable c
      INNER JOIN h ON 
            c.parent_id= h.Id
)
SELECT * FROM h

如果IDParent_ID 字段已编入索引,则此查询的性能可以接受,但不是很好。

向表中添加hierarchyid 字段将使查询更简单、更快。假设有一个hierarchy 字段,查询将是:

SELECT *
FROM ThatTable
ORDER BY hierarchy

hierarchy 上添加索引将非常快地执行此查询以及查找特定节点的子节点等任何查询。服务器无需递归查询,只需查看该单个索引即可。

文章Lesson 1: Converting a Table to a Hierarchical Structure 展示了如何使用hierarchyid 创建一个新表并从父/子数据填充它。

【讨论】:

  • 当我应用此查询时,没有运行.. 出现错误“关键字'WITH'附近的语法不正确。”我该怎么办?在运行该查询之前我必须做些什么?我应该在该表中添加一个名为 hierarchyid 的列吗?如果是,那是自动增量吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多