2

一意の列(sal_id、gal_id、amount、tax)を持つACTUALとESTIMATEの2つのテーブルがあります。

実際のテーブルには

actual_id, sal_id, gal_id, process_flag, amount, tax    
1          111     222     N             100     1  
2          110     223     N             200     2

ESTIMATEテーブルに私は持っています

estimate_id, sal_id, gal_id, process_flag, amount, tax      
3            111     222     N             50      1  
4            123     250     N             150     2 
5            212     312     Y             10      1 

ここで、ACTUALテーブルからのレコードが必要なファイナルテーブルが必要です。ACTUALにsal_id + gal_idマッピングのレコードが存在しないが、ESTIMATEには存在する場合は、見積もりレコードにデータを入力します(金額と税金を追加します)。

FINALテーブル

id  sal_id, gal_id, actual_id, estimate_id, total   
1   111     222     1          null         101 (since record exist in actual table for 111 222)   
2   110     223     2          null         202 (since record exist in actual table for 110 223)  
3   123     250     null       4            51  (since record not exist in actual table but estimate exist for 123 250)    

(見積もりの​​212 312の組み合わせの場合、レコードはすでに処理されているため、再度処理する必要はありません)。

Oracle11gを使用しています。単一のSQLクエリでロジックを作成するのを手伝ってください。

4

2 に答える 2

2

これがSQLFiddleの例です

select sal_id,gal_id,actual_id,null estimate_id,amount,tax from actual where process_flag='N' 
union all
select sal_id,gal_id,null actual_id,estimate_id,amount,tax from estimate where process_flag='N' and
(sal_id,gal_id) not in (select sal_id,gal_id from actual where process_flag='N')
于 2012-08-28T18:38:53.763 に答える
0

これを行う1つの方法は、Actualからすべてを取得し、次にEstimateでActualにないものだけを取得することです。

select a.*
from Actual a
union all
select e.*
from Estimate e
where not exists (select 1 from actual a where a.sal_id = e.sal_id and a.gal_id = e.gal_id) and
      e.process_flag = 'N'

大量のデータがある場合、これは最も効率的なアプローチではない可能性があります。ただし、小さいデータセットでは正常に機能するはずです。

于 2012-08-28T18:42:01.157 に答える