SQL - 具有父子关系的排序表

时间:2011-08-19 06:25:11

标签: sql sorting

我们有一个包含父子关系的表,并希望对其进行排序。排序标准是这样的,当迭代结果时,匹配父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排序不会解决问题。

3 个答案:

答案 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可能无法按请求的顺序存储数据。