来自多个源的Oracle加载目标列

时间:2013-05-01 13:58:57

标签: sql oracle11g

如何通过读取或比较来自两个不同源列的数据来加载目标表列。我有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

有什么想法?

3 个答案:

答案 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;

Here is a sqlfiddle demo