sql - SQL Server 2008 中与其他列的排序树

标签 sql tsql sql-server-2008

我有一个使用 实现树的表层次ID 柱子

样本数据:

People             \
    Girls          \1\
        Zoey       \1\1\
        Kate       \1\2\
        Monica     \1\3\
    Boys           \2\
        Mark       \2\1\
        David      \2\2\

这是使用 的命令层次ID 列作为排序列

我想使用 对数据进行排序层次ID 但也使用 姓名 所以它看起来像这样:
People             \
    Boys           \2\
        David      \2\2\
        Mark       \2\1\        
    Girls          \1\
        Kate       \1\2\
        Monica     \1\3\
        Zoey       \1\1\    

有没有一个简单的解决方案来做到这一点?

可以用单个SQL 完成吗?询问?

最佳答案

将您的查询重写为递归 CTE :

DECLARE @table TABLE (id INT NOT NULL PRIMARY KEY, name NVARCHAR(4000) NOT NULL, path HIERARCHYID)

INSERT
INTO    @table
VALUES  
        (1, 'People', '/'),
        (2, 'Girls', '/1/'),
        (3, 'Boys', '/2/'),
        (4, 'Zoey', '/1/1/'),
        (5, 'Kate', '/1/2/'),
        (6, 'Monica', '/1/3/'),
        (7, 'Mark', '/2/1/'),
        (8, 'David', '/2/2/')

;WITH   q AS
        (
        SELECT  *, HIERARCHYID::Parse('/') AS newpath
        FROM    @table
        WHERE   path = HIERARCHYID::GetRoot()
        UNION ALL
        SELECT  t.*, HIERARCHYID::Parse(q.newpath.ToString() + CAST(ROW_NUMBER() OVER (ORDER BY t.name) AS NVARCHAR(MAX)) + '/')
        FROM    q
        JOIN    @table t
        ON      t.path.IsDescendantOf(q.path) = 1
                AND t.path.GetLevel() = q.path.GetLevel() + 1
        )
SELECT  *
FROM    q
ORDER BY
        newpath

关于sql - SQL Server 2008 中与其他列的排序树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2711916/

相关文章:

c# - 如何重置 C# 中的标识列?

sql - "Invalid object name: dbo.etc"错误的根本原因是什么?

sql - 在 magento catal 中按 2 个属性对产品进行排序

sql-server - 获取特定表的每列长度的 T-SQL 语法是什么?

sql - 是否可以在主键不等于 column4 的表上写约束

sql-server - TFS 2013 中的报告

sql - 将 SQL Server 兼容模式从 90 更改为 100 时有哪些差异和问题?

mysql - 左连接查询需要永远执行

mysql - 如何在 SQL 中进行递归查询?

sql - 显示不带 order by 子句的 SQL 查询的顺序