2014-06-28 70 views
0

我有3個方案來實現。不等於內連接

案例1-當IM.Code = IME.Code和IM.Effective_st_dt = IME.effective_st_dt和IM.Effective_end_dt = IME.Effective-END_DATE

動作 - 在這種情況下我需要更新與IM currentMrp和currentCp。

案例2 - 當IM.Code = IME.Code和IM.Effective_st_dt!= IME.effective_st_dt和IM.Effective_end_dt = IME.Effective-END_DATE

行動 - 1)選擇從近期Effective_st_dt記錄IM和更新Effective_end_date用(IME.Effective_st_dt)-1

2)然後插入來自IME具有新effective_st_dt也該記錄lastMRP和lastcp是先前記錄在更新的currentmrp和Currentcp新紀錄1

情況3-當IM.Code = IME.Code和IM.Effective_st_dt!= IME .effective_st_dt和IM.Effective_end_dt!= IME.Effective-END_DATE

動作 - 1)拿起從IM最近Effective_st_dt記錄和更新與Effective_end_date(IME.Effective_st_dt)-1-

2.)然後從IME其中有新effective_st_dt也該記錄lastMRP和lastcp是先前記錄在1

這個更新的currentmrp和Currentcp插入新記錄是我的表的腳本

Create Table IM 
(
    ID int idenetity (1,1) 
    ,Code varchar(100) 
    ,CurrentMrp float 
    ,CurrentCP float 
    ,lastMrp float 
    ,lastCp float 
    , effective_st_dt date 
    ,effective_end_dt date 
) 

Create table IME 
(
    Code varchar(100) 
    ,CurrentMrp float 
    ,CurrentCP float 
    ,Effective_st_dt date 
    ,Effective_end_dt date 
) 

insert into IM (code, currentMrp, currentCp, lastMRP, lastCP, effective_st_dt, effective_end_dt) 
    Select 
     'CA123', 10.12, 5.0, 8.20, 4, '2014-05-01', '2014-05-31' 
    union 
Select 'CA123',15.0,5.0,10.12,8.20,'2014-06-01','2014-08-31' 
union 
Select 'CA121',50.0,15.0,45.0,25.0,'2014-04-01','2014-05-31' 
union 
Select 'CA121',75.0,25.0,50.0,15.0,'2014-06-01','2014-06-30' 
union 
Select 'CA131',53.0,12.0,35.0,10.0,'2014-05-01','2014-05-31' 
union 
Select 'CA131',60.0,15.0,53.0,12.0,'2014-06-01','2014-08-31' 


Insert into IME (code,effective_st_dt,effective_end_dt) 
Select ('CA123',20.0,5.0,'2014-06-01','2014-08-31') 
union 
Select ('CA123',25.0,6.0,'2014-06-20','2014-08-31') 
union 
Select ('CA123',35.0,7.0,'2014-07-15','2015-03-31') 

請幫我解決這個

您的幫助表示讚賞

回答

1

其更好使用左連接,而不是內部聯接在這種特殊情況下,否則不等於不會給你正確的結果。