【问题标题】:How to query multiple Child data against one Master data?如何针对一个主数据查询多个子数据?
【发布时间】:2020-01-27 07:06:05
【问题描述】:

我想选择一位家长及其下的所有孩子。甲骨文所做的是它不断向父母展示反对它的孩子。 请告诉我如何在 ORACLE 中显示以下查询:

select d.department_name, e.last_name from employees e join departments d
on (d.department_id=e.department_id)
group by d.department_name, e.last_name
order by 1;

DEPARTMENT_NAME                LAST_NAME
------------------------------ ------------
Accounting                     Gietz
Accounting                     Higgins
Executive                      De Haan
Executive                      King
Executive                      Kochhar
-------------------------------------------

像这样:

DEPARTMENT_NAME                LAST_NAME
------------------------------ ------------
Accounting                     Gietz
                               Higgins
Executive                      De Haan
                               King
                               Kochhar
-------------------------------------------

【问题讨论】:

  • 这种报告格式应该在应用程序(GUI)中完成。 SQL 并不是真正的正确选择
  • ... 因为使用 SQL 我们只选择数据。 “希金斯”属于“会计”,不属于“”。 可以用 SQL 来做到这一点(使用LAG 看看这是否与前一个部门相同),但我同意 a_horse_with_no_name,你应该关心布局/显示您的应用或网站。
  • 顺便问一下,为什么要使用GROUP BY 子句?您没有在查询中汇总任何内容。删除它。
  • 感谢您的宝贵建议!!

标签: sql oracle parent-child


【解决方案1】:

您可以使用analytical function,如下:

Select case when rn = 1 then department_name end as dept
       ,last_name from
(select d.department_name, e.last_name,
       Row_number() over (partition by d.department_name order by e.last_name) as rn
 from employees e join departments d
on (d.department_id=e.department_id)
group by d.department_name, e.last_name)
order by department_name, rn;

干杯!!

【讨论】:

  • 非常感谢你,伙计!你确实是个救世主:D
  • @tayeen 。 . . order byrn 的计算不匹配,因此这并不能保证 nulls 遵循部门名称。
  • @GordonLinoff :内部查询中的相同部门必须具有相同的部门名称,因此当我在order by 中添加RN 以保证订单时,它将起作用。更新了答案。
【解决方案2】:

这种类型的数据转换最好在应用层完成。但是,如果您想在 SQL 中执行此操作,则可以使用窗口函数——但需要注意的是行的顺序非常很重要。我建议:

select (case when row_number() over (partition by d.department_id order by e.last_name) = 1
             then d.department_name
         end) as dept,
       last_name 
from employees e join
     departments d
     on d.department_id = e.department_id
group by d.department_name, e.last_name
order by d.department_name, dept nulls last;

我也真诚地怀疑您是否需要group by,除非表格有重复。所以:

select (case when row_number() over (partition by d.department_id order by e.last_name) = 1
             then d.department_name
         end) as dept,
       last_name 
from employees e join
     departments d
     on d.department_id = e.department_id
order by d.department_name, dept nulls last;

【讨论】:

  • 你是对的。不需要 GROUP BY 子句。谢谢你! :D 但是您的查询不会产生所需的结果。它首先只显示这个部门名称,然后显示员工的姓名,而不告诉谁在哪个部门。
  • @tayeen 。 . .固定的。 order by 需要两个键,而不是一个。
  • 现在就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2013-07-30
相关资源
最近更新 更多