0

如何通过读取或比较来自两个不同源列的数据来加载目标表列。我有 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 名称状态
   1 迈克
   2 约翰·B
   3 凯利 C

有什么想法吗?

4

3 回答 3

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;
于 2013-05-01T14:03:54.810 回答
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 的记录,则合并不会针对 source2 执行选择。

你可以这样写:

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;
于 2013-05-01T17:25:23.717 回答
1

a_horse_with_no_name 的答案很好,但还有另一种选择 -
而不是CASE使用COALESCE 函数

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;

这是一个 sqlfiddle 演示

于 2013-05-01T16:01:44.940 回答