从表中选择行并使用多个相互关联的列进行排序

时间:2016-11-25 15:40:48

标签: php sql oracle stored-procedures

我有一张包含“团队”信息的表格。团队可以有子团队 - 每个子行都有一个“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来使用存储过程,这对我来说是新的。

1 个答案:

答案 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