2013-05-01 64 views
0

如何通過讀取或比較來自兩個不同來源列的數據加載目標表列。我有2個不同的來源,來源1和來源2與列名狀態也都有employee_id作爲PK。我想加載我的目標列與來自源1的數據,如果來自源1列的數據不可用,那麼我應該從源2加載它。有沒有辦法,我可以從plsql實現這一點?Oracle從多個來源加載目標列

如:

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

喜歡的東西:

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

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

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中的一條記錄被發現聚結不執行對選擇源2。

你就可以寫成:

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;