如何在Oracle SQL 中单行显示相关记录?

Posted

技术标签:

【中文标题】如何在Oracle SQL 中单行显示相关记录?【英文标题】:How to display the related records in a single row in Oracle SQL? 【发布时间】:2020-03-30 21:17:49 【问题描述】:

我编写了一个连接两个表的查询,我得到了以下结果集:

SELECT emp.employee_id,
      dept.department_name, 
      dept.department_id                                    
FROM employee emp, 
    department dept                                
WHERE emp.department_id = dept.department_id;
Employee_ID Department  Department_ID
Mark        Sales          D1
Mark        Marketing      D2
Justin      Textiles       D3
Kimberley   (null)        (null) 

但是,我需要在输出下方显示一个名为“状态”的新字段。马克可以在两个部门工作,因此计数为“2”,状态为“Y”(显示任何一条记录都是好的) 。 Justin 只在一个部门工作,计数为 1,状态应为“N”。 Kimberley 在任何地方都不起作用,计数为 0,状态应为“N”。

预期输出:

Employee_ID  Department  Department_ID  Status
Mark          Sales          D1            Y
Justin        Textiles       D3            N
Kimberley      (null)       (null)         N

请帮忙。

【问题讨论】:

【参考方案1】:

我认为这可以使用group bykeep 子句和max 轻松实现,如下所示:

SELECT emp.employee_id,
      Max(dept.department_name) keep (dense_rank first order by dept.department_id) as department_name,
      Max(dept.department_id) keep (dense_rank first order by dept.department_id) as department_id,
      case when count(1) > 1 then 'Y' else 'N' end as status                                   
FROM employee emp 
     LEFT JOIN department dept ON emp.department_id = dept.department_id
GROUP BY emp.employee_id;

干杯!!

【讨论】:

【参考方案2】:

我了解到您希望显示每个用户的第一个部门,并添加一个标志来指示该员工是否属于至少一个其他部门。

你可以使用窗口函数:

select 
    employee_id,
    department_name,
    department_id
    case when cnt <= 1 then 'N' else 'Y' end status
from (
    select 
        emp.employee_id,
        dept.department_name, 
        dept.department_id,
        row_number() over(partition by emp.employee_id order by dept.department_id) rn,
        count(*) over(partition by emp.employee_id) cnt
    from 
        employee emp
        left join department dept on emp.department_id = dept.department_id
) t
where rn = 1

旁注:始终使用显式连接(使用 on 关键字)而不是老式的隐式连接(在 from 子句中使用逗号),其语法更难阅读和维护。

【讨论】:

以上是关于如何在Oracle SQL 中单行显示相关记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何查询oracle数据库的操作记录?

选择独立行并将它们显示为单行 (ORACLE SQL)

在 SQL Server 中,如何以类似于 Oracle 的“SELECT FOR UPDATE WAIT”的方式锁定单行?

Oracle_SQL 单行函数

Oracle常用函数

ORACLE常用函数汇总