Sql 按家长和孩子选择记录
当一些记录是其他记录的父项时,我有一个包含记录的表 我有一个列Sql 按家长和孩子选择记录,sql,sql-server,Sql,Sql Server,当一些记录是其他记录的父项时,我有一个包含记录的表 我有一个列parent,它的零值表示它是父项。当是子记录时,它具有父记录的id 我需要的是按顺序、家长和孩子列出记录 我的表格工具: ID | order | parent | name 100 | 1 | 0 | X 200 | 2 | 0 | Y 150 | 0 | 100 | X.1 300 | 0 | 200 | Y.1 我需要以下结果: ID | ord
parent
,它的零值表示它是父项。当是子记录时,它具有父记录的id
我需要的是按顺序、家长和孩子列出记录
我的表格工具
:
ID | order | parent | name
100 | 1 | 0 | X
200 | 2 | 0 | Y
150 | 0 | 100 | X.1
300 | 0 | 200 | Y.1
我需要以下结果:
ID | order | parent | name
100 | 1 | 0 | X
150 | 0 | 100 | X.1
200 | 2 | 0 | Y
300 | 0 | 200 | Y.1
我怎么能点这个
如果我使用这个查询
select t.*
from t
order by (case when parent = 0 then id else parent end), order desc;
结果是:
ID | order | parent | name
200 | 2 | 0 | Y
300 | 0 | 200 | Y.1
100 | 1 | 0 | X
150 | 0 | 100 | X.1
如果我更改为order asc
,它会将order=0的记录放在顶部
看这个
谢谢这回答了问题的原始版本
在这种情况下,您可以使用
按顺序:
select t.*
from t
order by (case when parent = 0 then id else parent end), order desc;
是一个SQL FIDLE,它演示了这对原始问题有效。这回答了问题的原始版本 在这种情况下,您可以使用按顺序:
select t.*
from t
order by (case when parent = 0 then id else parent end), order desc;
是一个SQL FIDLE,它演示了这对原始问题有效。您需要构造一个值,以提供所需的顺序。一种方法是构造一个具体化的路径,对订单标准进行编码。由于您使用的是SQL Server,因此可以使用它的hierarchyid数据类型,但是,真正的魔力在于构建物化路径本身,我将展示其中的两个版本,一个与hierarchyid(
path
)一起使用,另一个没有(path2
):
在上面的查询中,使用递归公共表表达式遍历树并构建两个示例路径。第一条路径虽然可以作为排序列单独使用当前ID,但一旦您的ID长度不是三位数,它就会开始失败,因为最重要的位数不一定正确对齐。在最终查询中对heirarchyid的转换解决了这个问题。第二条路径可以直接用作排序键,因为它将路径的每一级强制转换为四字节二进制值,因此它可以处理高达4294967295的ID和1000级的路径长度(树深度),并且不需要对任何其他数据类型进行最终强制转换。您需要构造一个提供所需顺序的值。一种方法是构造一个具体化的路径,对订单标准进行编码。由于您使用的是SQL Server,因此可以使用它的hierarchyid数据类型,但是,真正的魔力在于构建物化路径本身,我将展示其中的两个版本,一个与hierarchyid(
path
)一起使用,另一个没有(path2
):
在上面的查询中,使用递归公共表表达式遍历树并构建两个示例路径。第一条路径虽然可以作为排序列单独使用当前ID,但一旦您的ID长度不是三位数,它就会开始失败,因为最重要的位数不一定正确对齐。在最终查询中对heirarchyid的转换解决了这个问题。第二条路径可以直接用作排序键,因为它将路径的每一级强制转换为四字节二进制值,因此它可以处理高达4294967295的ID和1000级的路径长度(树深度),并且不需要对任何其他数据类型进行最终强制转换。您正在处理哪个数据库?通过这种方式,我们可以为您定制最佳答案。您正在使用哪个数据库?这样我们就可以为您量身定做最佳答案。请看这个例子请看这个例子