我们有一个父子关系的表,并希望对它进行排序。排序标准是使得迭代虽然结果的行匹配父ID应该已经在那里当:SQL - 父子关系排序表
ID PARENT_ID
EF01 EF02 // This is wrong as the row EF02 is after and will fail.
EF02
BB AA // here BB < AA
AA EF01
的问题是,既密钥串,因此,通过ID或PARENT_ID排序是不会以固定问题。
我们有一个父子关系的表,并希望对它进行排序。排序标准是使得迭代虽然结果的行匹配父ID应该已经在那里当:SQL - 父子关系排序表
ID PARENT_ID
EF01 EF02 // This is wrong as the row EF02 is after and will fail.
EF02
BB AA // here BB < AA
AA EF01
的问题是,既密钥串,因此,通过ID或PARENT_ID排序是不会以固定问题。
对于Oracle,使用hierarchical queries:
select id, parent_id, level from the_table
start with parent_id is null
connect by prior id = parent_id;
我没有甲骨文测试上。这在SQL Server中有效,我相信它也可以在Oracle中使用。
with R(id, parent_id, lvl) as
(
select id,
parent_id,
1
from YourTable
where parent_id is null
union all
select T.id,
T.parent_id,
R.lvl + 1
from YourTable as T
inner join R
on T.parent_id = R.id
)
select R.id,
R.parent_id
from R
order by lvl
在Oracle中可能还有其他方法可以做到这一点。
除非您使用“ORDER BY CLAUSE”以特定顺序请求数据,否则任何DBMS都不会保证行的交付顺序。
在大多数数据库管理系统中,您可以指定数据以特定顺序存储在您想要订购的列上,使用“CLUSTERING INDEX”。但是,除非您在SQL中指定了“ORDER BY”,否则您不一定会按照此顺序返回数据。此外,在许多DBMS中,这是内部原因(磁盘空间,并行工作单元等)的“尽力而为”规范,DBMS可能无法按请求的顺序存储数据。
你使用什么DBMS? SQL Server,Oracle,MySQL ...? –
如果两列都是字符串,为什么'ORDER BY PARENT_ID ASC,ID ASC'失败? – rabudde
Rabudde,由于身份证的性质 - 我会改变例子,以便更容易看到。 Mikael,有没有一个通用的解决方案,如果没有它是Oracle – ic3