【问题标题】:Select rows from a table and use multiple interrelated columns for ordering从表中选择行并使用多个相互关联的列进行排序
【发布时间】:2017-04-10 01:21:24
【问题描述】:

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

【问题讨论】:

  • 为什么不用 php 来实现呢?
  • @Vasil 我可能会尝试使用 PHP 实现我想要的,但我正在寻找 SQL 解决方案的原因是因为团队的数量未知,我将检索并显示 50 条记录页面,按照我指定的顺序
  • 对不起,伙计,如果不更改数据库,我想我无法帮助您。不止一个查询呢?
  • 这与 PHP 无关,它可以(并且应该)在数据库中非常有效地完成。正如 Boneist 所展示的那样。

标签: php sql oracle stored-procedures


【解决方案1】:

您可以使用带有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 

【讨论】:

  • 重点是,即使忽略同级的顺序 - 这正是分层查询的用途!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多