2017-05-12 9 views
1

私は、deptをリストする文と、重複した従業員があるかどうかを記述しようとしています(重複する従業員は、2つ以上のレコードが同じ名字Oracle SQL /子テーブルで重複を見つける方法

T1:部門は T2:Empの T3:Party_Rel 注:T3は

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 

を表1の交差点としての2列は、私は、これらの3つのテーブルを持っている)

を無視していますそう: 売上高は マーケティングは0従業員持っている2人の従業員を擁してい ファイナンスは3人の従業員を持ち、2は私のクエリの結果は次のようになり、同じファースト+姓に

を持っている:3人の従業員を擁してい

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

販売そして、彼らはので、私はないDuplicateCheck =「PASS」 マーケティングは0従業員を持っているので、DuplicateCheck =「N/A」 ファイナンス3人の従業員を持ち、そのうちの2が重複しているのでDuplicateCheck =「失敗」

、すべて一意ですDuplicateCheckを表示するSQLを構築することを知らない: 私の第1の問題は、DeptとEmpの間の交差テーブルです。私はそれをどのように使用するのか分かりません。 私の第2の問題は、重複チェックの結果を表示値(合格、N/Aまたは失敗)に変換する方法です。

ありがとうございました。

答えて

0

あなたはこのために凝集を使用することができます。

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; 
+0

ありがとうございます。期待通りに動作します。 –

+0

@Largoようこそ – GurV

0

カウント分析機能は、重複をチェックするために便利です。

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; 
関連する問題