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级的路径长度(树深度),并且不需要对任何其他数据类型进行最终强制转换。

您正在处理哪个数据库?通过这种方式,我们可以为您定制最佳答案。您正在使用哪个数据库?这样我们就可以为您量身定做最佳答案。请看这个例子请看这个例子