2016-11-25 48 views
1

我有一个包含有关“小组”的信息的表。团队可以有子团队 - 每行都有一个“parent_id”列包含该团队的父团队的“team_id”。下面是数据的一个例子:从表中选择行并使用多个相关列进行排序

team_id team_name parent_id 
1   sales  (null) 
2   executives (null) 
3   emea sales 1 
4   apac sales 1 
5   uk sales  3 

我试图做到的,是简单地TEAM_ID的顺序来选择表中的所有行,但我希望工作小组他们的母队之后返回,也TEAM_ID顺序。所以,上面的例子中的数据,我想在这个顺序返回的数据:

team_id team_name parent_id 
1   sales  (null) 
3   emea sales 1 
5   uk sales  3 
4   apac sales 1 
2   executives (null) 

我已经花了几个小时想知道如何做到这一点,还真没拿出任何有用的!我将不胜感激任何关于如何解决这个问题的指针。

请注意,我正在使用一个现有的项目,并且不能真正地进行剧烈的数据库/实施更改。我正在使用PHP和Oracle,并使用存储过程,这对我来说是新的。

+0

你为什么不使用PHP实现这一目标? –

+0

@Vasil我可能会尝试使用PHP来实现我想要的,但是我正在查看SQL解决方案的原因是因为团队的数量未知,我将按每个页面的顺序检索并显示50条记录指定 – osullic

+0

对不起队友,我不认为我会在不改变数据库的情况下帮助你。那么多一个查询呢? –

回答

2

您可以使用分层查询与ORDER SIBLINGS BY条款,比如:

WITH teams AS (SELECT 1 team_id, 'sales' team_name, NULL parent_id FROM dual UNION ALL 
       SELECT 2 team_id, 'executives' team_name, NULL parent_id FROM dual UNION ALL 
       SELECT 3 team_id, 'emea sales' team_name, 1 parent_id FROM dual UNION ALL 
       SELECT 4 team_id, 'apac sales' team_name, 1 parent_id FROM dual UNION ALL 
       SELECT 5 team_id, 'uk sales' team_name, 3 parent_id FROM dual) 
SELECT team_id, 
     team_name, 
     parent_id 
FROM teams 
CONNECT BY PRIOR team_id = parent_id 
START WITH parent_id IS NULL 
ORDER SIBLINGS BY team_id; 

    TEAM_ID TEAM_NAME PARENT_ID 
---------- ---------- ---------- 
     1 sales  
     3 emea sales   1 
     5 uk sales   3 
     4 apac sales   1 
     2 executives 
+1

重要的是,即使忽略了兄弟姐妹的排序 - 这完全是分层查询的目的! – mathguy

相关问题