2013-05-07 42 views
1

我們有一個源表,其中保存原始數據:從另一個表更新表,但也插入

SourceTable 
SD    Product P1 P2 
'01-Mar-2013' 'Prod1' 1 2 
'02-Mar-2013' 'Prod1' 3 4 
'03-Mar-2013' 'Prod1' 5 6 
'04-Mar-2013' 'Prod1' 7 8 
'04-Mar-2013' 'Prod2' 6 5 

,我們有目標表如下圖所示:

DestinationTable 
SD    Product P1 P2 Active 
'01-Mar-2013' 'Prod1' 9 10 1 

我想編寫一個查詢,該查詢將處理每個產品每天的源表中的數據,並將所有新行插入到目標表中,但我們還應該將dest中的Active列更新爲0。表(如果在源中找到匹配行)(如果SD和Product列存在於目標中,則確定該表)。

處理數據後,destinationTable會應該是這樣的:

SD    Product P1 P2 Active 
'01-Mar-2013' 'Prod1' 9 10 0 
'01-Mar-2013' 'Prod1' 1 2 1 
'02-Mar-2013' 'Prod1' 3 4 1 
'03-Mar-2013' 'Prod1' 5 6 1 
'04-Mar-2013' 'Prod1' 7 8 1 
'04-Mar-2013' 'Prod2' 6 5 1 

我試圖用MERGE要做到這一點,但你不能更新,並在同一時間插入時有找到匹配。

MERGE DestinationTable AS d 
USING (SELECT SD, Product, P1, P2 FROM SourceTable) AS s ON d.Product = s.Product AND s.SD = d.SD 
WHEN MATCHED THEN UPDATE SET d.P1 = s.P1, 
         d.P2 = sdsP2 
         d.Active = 0 
WHEN NOT MATCHED THEN 
    INSERT(SD,Product, P1, P2, Active) 
    VALUES(s.SD, s.Product, s.P1, s.P2, 1); 

其實我已經做了什麼,我想使用OUTPUT語句在SQL做然而,這是Oracle 10g和Oracle沒有輸出相同的SQL。

有沒有其他的方法來實現這一點。這不必與MERGE一起完成,我可以爲任何其他解決方案開放。

感謝

+0

ORACLE中的OUTPUT的等價物是RETURNING子句。不幸的是,MERGE不支持它。 – APC 2013-05-07 14:17:37

+0

謝謝,因爲我已經更新了這個問題,這不一定要用Merge來完成。 – 03Usr 2013-05-07 14:20:55

回答

3

你想要做什麼是

  1. 插入來自source所有記錄到destination
  2. 更新destination.active列其中任何匹配記錄source

由於你正確地指出,你不能用MERGE做到這一點,因爲MERGE想要更新當它找到匹配的記錄而不是更新和插入。

所以我認爲你堅持做這兩個報表:更新destination 首先然後插入source記錄。

UPDATE和INSERT都支持RETURNING子句,它允許您爲更新或插入的行收集標識符(和其他列)。它在文檔中:find out more

2

爲什麼不運行2個查詢?

UPDATE DestinationTable 
SET Active = 0 
WHERE EXISTS (SELECT 1 
       FROM SourceTable 
       WHERE DestinationTable.Product = SourceTable.Product AND 
        DestinationTable.SD = SourceTable.SD)