【问题标题】:organize sql heirarchy组织sql层次结构
【发布时间】:2015-06-13 10:25:39
【问题描述】:

我有下表:

Id   Son  RowOrder   Technology
1     8     NULL       fa
8     0     NULL       fa
9     15    NULL       gr
15    0     NULL       gr

我想创建一个 sql 查询,该查询将通过以下方式进行“排序” 顺序:技术,“父亲”(有儿子的记录),儿子(前父亲的直子) 并对 RowOrder 列进行更新,这样下次我将根据 RowOrder 对这些记录进行单独排序。 有任何想法吗? 谢谢

【问题讨论】:

  • 为什么要进行此更新?为什么不总是按技术订购,父亲,儿子?它会为您提供相同的结果,但如果您进行更新以将数字放入 RowOrder,那么您将需要在每次插入、更新或删除记录时运行该更新,以确保它仍然正确。
  • 列表不应该改变,只有顺序会由用户改变。所以我将创建一个界面来更新 RowOrder 列,但这个初始查询是我希望在用户第一次看到结果时显示结果的方式

标签: sql tsql hierarchy


【解决方案1】:

如果您不想更改数据,那么不要将数据存储在行号中,只需使用

SELECT 
   id,
   son, 
   technology,
   ISNULL((select id from table t2 where t2.id = t1.son), 0) AS father,
   ROW_NUMBER() OVER (ORDER BY technology, father, son) AS RowNumber
FROM 
   table t1 
ORDER BY 
   RowNumber ASC

函数 ISNULL() 和 ROW_NUMBER() 可能会根据您使用的数据库更改名称,但这是您应该使用的粗略概念。

【讨论】:

  • 好主意马丁,我稍微调整了一下。我添加了“父亲”列,并在 Row_Number() 子句的“排序依据”中将儿子的顺序更改为降序。所以现在我有这个:ROW_NUMBER() OVER (ORDER BY technology, parent, son desc) AS RowNumber。它正在工作,非常感谢。
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 2021-10-09
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
相关资源
最近更新 更多