2015-06-13 222 views
0

我有如下表:组织SQL层次结构

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

我想创建一个SQL查询,将通过以下 命令“按订单”做一个:技术,“父亲”(这一纪录有一个儿子),儿子(以前父亲 的”直接儿子,做一个更新RowOrder列,因此下一次我将根据RowOrder订购这些记录鞋底。 任何想法? 感谢

+0

为什么你想要做这个更新?为什么不总是靠科技来命令父亲,儿子呢?它会得到相同的结果,但是如果在RowOrder中进行更新以将数字进行更新,则每次插入,更新或删除记录时都需要运行该更新,以确保它仍然正确。 – Swapnull

+0

列表不应该改变,只有顺序会被用户改变。所以我会创建一个界面来更新RowOrder列,但是这个初始查询是我第一次看到它们时显示结果的方式 –

回答

0

如果您不希望数据改变,而是将数据存储在行号中,只使用

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()可以根据您所使用的数据库更改名称,但那就是你应该去什么一个粗略的想法。

+1

martyn,我调整了一下。我添加了“Father”列,并在Row_Number()子句的“order by”中将儿子的顺序更改为降序。所以现在我有:ROW_NUMBER()OVER(ORDER BY技术,父亲,儿子desc)AS RowNumber。它的工作非常感谢。 –