2011-08-19 303 views
2

我们有一个父子关系的表,并希望对它进行排序。排序标准是使得迭代虽然结果的行匹配父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排序是不会以固定问题。

+3

你使用什么DBMS? SQL Server,Oracle,MySQL ...? –

+0

如果两列都是字符串,为什么'ORDER BY PARENT_ID ASC,ID ASC'失败? – rabudde

+0

Rabudde,由于身份证的性质 - 我会改变例子,以便更容易看到。 Mikael,有没有一个通用的解决方案,如果没有它是Oracle – ic3

回答

3

对于Oracle,使用hierarchical queries

select id, parent_id, level from the_table 
start with parent_id is null 
connect by prior id = parent_id; 
+0

您是否知道SQL Server的解决方案? – ic3

+0

不,但@Mikael似乎有一个答案。 – Thilo

+0

非常感谢:-) – ic3

3

我没有甲骨文测试上。这在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中可能还有其他方法可以做到这一点。

+0

谢谢,这很酷关于stackoverflow我每次学习时都会学到一些东西:-) – ic3

+0

这个查询也在PostgreSql上运行。在之后添加RECURSIVE关键字。 (即用** RECURSIVE ** R(id,parent_id,lvl)as) – vahapt

0

除非您使用“ORDER BY CLAUSE”以特定顺序请求数据,否则任何DBMS都不会保证行的交付顺序。

在大多数数据库管理系统中,您可以指定数据以特定顺序存储在您想要订购的列上,使用“CLUSTERING INDEX”。但是,除非您在SQL中指定了“ORDER BY”,否则您不一定会按照此顺序返回数据。此外,在许多DBMS中,这是内部原因(磁盘空间,并行工作单元等)的“尽力而为”规范,DBMS可能无法按请求的顺序存储数据。