2012-07-28 95 views
1

我有兩個表ACTUAL AND ESTIMATE具有唯一列(sal_id,gal_id,金額,稅)。oracle sql查詢從兩個相似類型的表中獲取數據

在實際的表我有 ACTUAL_ID,sal_id,gal_id,process_flag,量,稅
1 111 222 N 100 1
2 110 223Ñ200 2

在估算表我有 estimate_id,sal_id ,gal_id,process_flag,量,稅
3 111 222 50ñ1
4 123爲250N 150 2 5 212 312 10Ý1

現在我想要的最終表,它應具有記錄來自ACTUAL表,如果在ACTUAL中沒有存在sal_id + gal_id映射的記錄,但存在於ESTIMATE中,則填充估算記錄(以及額外的金額和稅額)。

在最後的表
ID sal_id,gal_id,ACTUAL_ID,estimate_id,總
1空(因爲記錄在實際的表存在111 222)
2空(因爲記錄在實際的表存在110 223)
空4 (因爲記錄不存在於實際的表,但EST imate存在爲123 250)

(對於估計的212 312組合,因爲記錄已經處理,不需要再次處理)。

我正在使用Oracle 11g。請幫助我在單個SQL查詢中編寫邏輯?

謝謝。

+0

表格之間的關係是什麼? – tkt986 2012-07-28 14:34:11

+0

sal_id,gal_id對於這兩個表格都是通用的。我需要根據ACTUAL/ESTIMATE表處理記錄。 – 2012-07-28 15:35:15

回答

1

有幾種寫這個查詢的方法。一種方法是使用連接和合並:

select coalesce(a.sal_id, e.sal_id) as sal_id, 
     coalesce(a.gal_id, e.gal_id) as gal_id, 
     coalesce(a.actual_value, e.estimate_value) as actual_value 
from actual a full outer join 
    estimate e 
    on a.sal_id = e.sal_id and 
     a.gal_id = e.gal_id 

這假定sal_id/gal_id提供表之間的唯一匹配。

由於您使用的是Oracle,這裏也許是做的更明確的方式:

select sal_id, gal_id, actual_value 
from (select *, 
      max(isactual) over (partition by sal_id, gal_id) as hasactual 
     from ((select 1 as isactual, * 
      from actual 
      ) union all 
      (select 0 as isactual, * 
      from estimate 
      ) 
      ) t 
    ) t 
where isactual = 1 or hasactual = 0 

此查詢使用窗函數,以確定是否存在與匹配sal_id/gal_id實際記錄。邏輯是獲取所有實際數據,然後獲取實際數據中不匹配的所有記錄。

+0

謝謝戈登。我修改了我的問題,因爲需要在FINAL表中填充actual_id/estimate_id。 – 2012-07-28 15:32:47

+0

任何一個版本都可以工作。我更喜歡第二個版本。 – 2012-07-28 15:47:53

相關問題