如何通过读取或比较来自两个不同源列的数据来加载目标表列。我有2个不同的源,源1和源2具有列名状态,两个表都有employee_id作为PK。我想用来自源1的数据加载我的目标列,如果来自源1列的数据不可用,那么我应该从源2加载它。有没有办法可以从plsql实现这一点?
例如:
Source 1
emp id status
1 A
2 B
source 2
emp id status
1 B
3 C
emp source
emp id name
1 Mike
2 John
3 Kelly
4 Jake
目标表emp
emp id name status 1 Mike A 2 John B 3 Kelly C
有什么想法?
答案 0 :(得分:3)
类似的东西:
select e.emp_id,
e.name,
case
when s1.id is not null then s1.status
else s2.status
end as status
from emp e
left join source_1 s1 on e.emp_id = s1.id
left join source_2 s2 on e.emp_id = s2.id;
答案 1 :(得分:2)
如果在您检查的第一个表中经常找到匹配项,那么您可能会发现这是一个有用的优化:
SELECT e.emp_id,
e.name,
coalesce(s1.status, (select s2.status
from source2 s2
where s2.emp_id = e.emp_id))
FROM emp_source e
LEFT JOIN source1 s1 ON e.emp_id = s1.emp_id;
如果找到source1的记录,则coalesce不会对source2执行select。
您可以将其写为:
SELECT e.emp_id,
e.name,
coalesce((select s1.status
from source1 s1
where s1.emp_id = e.emp_id),
(select s2.status
from source2 s2
where s2.emp_id = e.emp_id))
FROM emp_source e;
答案 2 :(得分:1)
a_horse_with_no_name's answer是一个很好的选择,但还有另一种选择 -
而不是使用CASE
使用COALESCE function:
SELECT e.emp_id,
e.name,
coalesce(s1.status, s2.status)
FROM emp_source e
LEFT JOIN source1 s1 ON e.emp_id = s1.emp_id
LEFT JOIN source2 s2 ON e.emp_id = s2.emp_id
WHERE coalesce(s1.status, s2.status) IS NOT NULL;