我们有一个包含父子关系的表,并希望对其进行排序。排序标准是这样的,当迭代结果时,匹配父ID的行应该已经存在:
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排序不会解决问题。
答案 0 :(得分:3)
对于Oracle,使用hierarchical queries:
select id, parent_id, level from the_table
start with parent_id is null
connect by prior id = parent_id;
答案 1 :(得分:3)
我没有Oracle进行测试。这适用于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中可能还有其他方法可以做同样的事情。
答案 2 :(得分:0)
除非您使用“ORDER BY CLAUSE”按特定顺序要求输入数据,否则任何DBMS都不会保证交付行的顺序。
在大多数DBMS中,您可以使用要排序的列上的“CLUSTERING INDEX”指定以特定顺序存储的数据。但是,除非在SQL中指定“ORDER BY”,否则不必按此顺序获取数据。此外,在许多DBMS中,这是出于内部原因(磁盘空间,并发工作单元等)的“尽力而为”规范,DBMS可能无法按请求的顺序存储数据。