【问题标题】:Oracle SQL / How to find duplicate in a child tableOracle SQL /如何在子表中查找重复项
【发布时间】:2017-05-12 09:20:39
【问题描述】:

我正在尝试编写一个语句,列出部门以及他们是否有重复的员工(重复的员工是指 2 个或更多记录具有相同的名字和姓氏,其他列被忽略)

我有这 3 张桌子:

T1:部门 T2:雇员 T3:Party_Rel 注意:T3 是表 1 和表 2 的交集

Dept:
Id   | DeptName
---- | --------
1    | Sales
2    | Marketing
3    | Finance

Emp:
Id   | EmpFirstName | EmpLastName
---- | ------------ | ------
1    | Hope         | Smith
2    | Judith       | Bolt
3    | Nathalie     | Meyers
4    | Nathalie     | Meyers
5    | Helen        | Chute

Party_Rel:
Id   | DeptId | EmpId
---- | ------ | -----
1    | 1      | 1
2    | 1      | 2  
3    | 3      | 3  
4    | 3      | 4
5    | 1      | 5
6    | 3      | 5

所以: 销售人员 2 人 市场部有 0 名员工 财务部有 3 名员工,其中 2 名员工姓名相同

我的查询结果如下:

DeptId | DeptName     | DuplicateCheck
------ | ------------ | ----------- 
1      | Sales        | Pass
2      | Marketing    | N/A
3      | Finance      | Fail

Sales 有 3 名员工,他们都是独一无二的,因此 DuplicateCheck = 'PASS' 营销部门有 0 名员工,因此 DuplicateCheck = 'N/A' 财务部有 3 名员工,其中 2 名重复,因此 DuplicateCheck = 'Fail'

我不知道如何构建 SQL 来显示 DuplicateCheck: 我的第一个问题是 Dept 和 Emp 之间的交集表,我不知道如何使用它。 我的第二个问题是如何将重复检查的结果转换为显示值(通过、不适用或失败)。

感谢您的帮助。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以为此使用聚合:

    select d.id as DeptId, 
        d.deptName,
        case when count(p.id) = 0 then 'N/A'
            when count(distinct e.id) = count(distinct e.empfirstname || ';' || e.emplastname) then 'Pass'
            else 'Fail'
        end as duplicatecheck
    from Dept d
    left join party_rel p on d.id = p.deptId
    left join emp e on p.empId = e.id
    group by d.id, d.deptName;
    

    【讨论】:

      【解决方案2】:

      计数分析功能便于检查重复。

      select deptid, deptname, decode(sum(c), -1, 'N/A', 0, 'Pass', 'Fail') duplicatecheck
      from (
      select d.id deptid, d.deptname, e.empfirstname, e.emplastname,
          count(e.id) over (partition by d.id, e.empfirstname, e.emplastname) - 1 c
      from dept d, emp e, party_rel p
      where p.deptid (+) = d.id and p.empid = e.id (+)
      )
      group by deptid, deptname;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        • 2010-09-08
        • 2018-06-29
        • 2021-09-02
        • 2014-09-03
        • 1970-01-01
        • 2022-01-18
        相关资源
        最近更新 更多