3 db2
我有两个 DB2 表。
表 1,称为 EmployeeFile
EmployeeFile
有以下列: EMP_ID, FNAME, LNAME, DOB
数据如下所示:
EMP_ID, FNAME, LNAME, DOB
- GB2342, John, Smith, 1970-12-10
- L3243C, Jane, Jones, 1969-11-09
Run Code Online (Sandbox Code Playgroud)
表2,称为 OriginalData
OriginalData
有以下列:INTERNAL_ID, FNAME, LNAME, DOB
.
数据如下所示:
INTERNAL_ID, FNAME, LNAME, DOB
- 6575678588, Jane, Jones, 1969-11-09
- 1232145564, Rob, Mitchell, 1968-10-08
- 3452345345, John, Smith, 1970-12-10
- 6786478568, John, Smith, 1970-12-10
Run Code Online (Sandbox Code Playgroud)
我想说明的所有行EmployeeFile
的该(FNAME, LNAME, DOB)
组合只发生一次OriginalData
。
例如,如果我在上面显示的示例数据集上运行查询,它应该只返回以下行:
我不想要“John Smith”,因为尽管他存在于 中EmployeeFile
,但他的(FNAME, LNAME, DOB)
组合在 中出现了两次OriginalData
。
我不想要“Rob Mitchell”,因为他不存在于EmployeeFile
.
题
我该怎么做呢?
我能想到的唯一方法是非常丑陋:(FNAME, LNAME, DOB)
从两个表中连接(使用一些分隔符,如 ~),对该列进行连接,通过 have 进行分组count(that concatenated column) = 1
,然后在 上进行另一个选择EmployeeFile
,仅选择(FNAME, LNAME, DOB)
匹配解析该连接字符串的子字符串!
非常简单:
select e.*
from EmployeeFile e
inner join
(
select FNAME, LNAME, DOB
from OriginalData
group by FNAME, LNAME, DOB
having count(1) = 1
) o
on (e.FNAME, e.LNAME, e.DOB) = (o.FNAME, o.LNAME, o.DOB)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
66 次 |
最近记录: |