【问题标题】:Order Oracle Database Results as Parent And then Its Children, Then Order the Children By Date将 Oracle 数据库结果排序为父项,然后是子项,然后按日期对子项进行排序
【发布时间】:2021-11-22 12:22:53
【问题描述】:

考虑下表:

employer_id supervisor_employer_ref date_hired
22436 NULL 01/02/2006
37854 25558 07/12/2018
25558 NULL 10/16/2010
48796 25558 11/11/2015
28449 22436 08/14/2016
34663 25558 10/10/2019
45687 22436 04/12/2020

出于某种特定原因,我必须由雇主订购此表,然后由其受监管的雇主订购,并在 Oracle 12c 数据库上按 date_hired 订购。 我知道这不是创建数据库的最理想方式,但出于特定原因,我必须保持这种方式。

预期结果:

employer_id supervisor_employer_ref date_hired
22436 NULL 01/02/2006
28449 22436 08/14/2016
45687 22436 04/12/2020
25558 NULL 10/16/2010
48796 25558 11/11/2015
37854 25558 07/12/2018
34663 25558 10/10/2019
45687 22436 04/12/2020

【问题讨论】:

  • 这是一个层次表,所以需要递归查询。你走了多远?你被困在哪里了?请出示您的疑问并告诉我们您自己未能解决的任务的哪一部分。
  • 现在我只做了类似 SELECT A.*, rownum r FROM employees ORDER BY supervisor_employer_ref, date_hired 我不知道从这里去哪里
  • 这几乎没有。查找如何编写递归查询。例如:oracle-base.com/articles/11g/recursive-subquery-factoring-11gr2。您需要它来查询像您这样的分层数据。然后看看你能走多远,然后带着一个具体的问题回来。
  • @ThorstenKettner - 在 Oracle 中,查询分层表的最常用方法是使用 分层 查询,使用 connect by 和相关功能,不是 使用递归查询。分层查询可能被证明要快很多倍(因为它们要做的工作更少,并且它们已被 Oracle 显着优化,因为它们自 Oracle 版本 1 以来就存在)。
  • @mathguy:我也考虑这些递归查询。只是语法不同。我发布的链接中也对它们进行了说明。

标签: sql oracle oracle12c


【解决方案1】:

您想要分层查询并使用ORDER SIBLINGS BY

SELECT *
FROM   table_name
START WITH
       supervisor_employer_ref IS NULL
CONNECT BY
       PRIOR employer_id = supervisor_employer_ref
ORDER SIBLINGS BY date_hired;

其中,对于样本数据:

CREATE TABLE table_name (employer_id, supervisor_employer_ref, date_hired) AS
SELECT 22436, NULL,  TO_DATE( '01/02/2006', 'MM/DD/YYYY' ) FROM DUAL UNION ALL
SELECT 37854, 25558, TO_DATE( '07/12/2018', 'MM/DD/YYYY' ) FROM DUAL UNION ALL
SELECT 25558, NULL,  TO_DATE( '10/16/2010', 'MM/DD/YYYY' ) FROM DUAL UNION ALL
SELECT 48796, 25558, TO_DATE( '11/11/2015', 'MM/DD/YYYY' ) FROM DUAL UNION ALL
SELECT 28449, 22436, TO_DATE( '08/14/2016', 'MM/DD/YYYY' ) FROM DUAL UNION ALL
SELECT 34663, 25558, TO_DATE( '10/10/2019', 'MM/DD/YYYY' ) FROM DUAL UNION ALL
SELECT 45687, 22436, TO_DATE( '04/12/2020', 'MM/DD/YYYY' ) FROM DUAL;

输出:

EMPLOYER_ID SUPERVISOR_EMPLOYER_REF DATE_HIRED
22436 02-JAN-06
28449 22436 14-AUG-16
45687 22436 12-APR-20
25558 16-OCT-10
48796 25558 11-NOV-15
37854 25558 12-JUL-18
34663 25558 10-OCT-19

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多