2012-06-04 71 views
0

我有一個表(表1),其具有4列比較有條件地更新表:的Oracle SQL:基於與SQL語句

UID | PID | VALUE1 | VALUE2

我還有一個SQL語句(STMT)從一些其他表返回3列:

UID | PID | VALUE1

現在,這裏是我要如何更新TABLE1條件:

首先,從與那些在TABLE1 STMT比較UID和PID對所有新的UID和PID,

  1. 對未在表1,從STMT插入新行插入到表1,設置TABLE1.VALUE2 = 0(我已經做了這一個)

  2. 在這兩個STMT和TABLE1現有的UID和PID對,這樣做:

    a。如果TABLE1.VALUE2> 0,更新TABLE1.VALUE1 = STMT.VALUE1

    灣如果TABLE1.VALUE2 = 0並且如果TABLE1.VALUE1!= STMT.VALUE1,則更新TABLE1.VALUE1 = STMT.VALUE1,否則不做任何事情。

我無法提出條件2的解決方案。任何幫助表示讚賞!

+0

第2步後,最終的結果是,table1.value1的所有案件= stmt.value 1.你特別需要避免更新行相同的他們已經是價值觀,觸發器不會觸發? –

+0

@evilotto很好,最終目的是讓TABLE1始終保持最新狀態。 –

回答

1
UPDATE (
    SELECT table1.UID 
      ,table1.PID 
      ,table1.value1 AS table1_value1 
      ,table1.value2 AS table1_value2 
      ,stmt.value1 AS stmt_value1 
    FROM table1 
    INNER JOIN (SELECT ? AS UID 
         ,? AS PID 
         ,? AS value1 
       FROM whatever) stmt 
     ON stmt.UID = table1.UID 
     AND stmt.PID = table1.PID 
) x 
SET x.table1_VALUE1 = CASE WHEN (x.table1_VALUE2 > 0) OR 
           (x.table1_VALUE2 = 0 AND x.table1_VALUE1 <> x.stmt_VALUE1) 
           THEN x.stmt_VALUE1 
         ELSE x.table1_VALUE1 
        END 
+0

謝謝您的回答凱德,但是我有可能是愚蠢的問題:你怎麼投SQL語句轉換成STMT這樣你就可以在你的update語句使用它作爲STMT.value1? –

+0

@AlanHan使用另一個嵌套的子查詢 - 答案已更新 –

+0

再次感謝您的幫助。我現在正在獲得「ORA-01779:無法修改映射到非鍵保存表的列」錯誤。任何想法爲什麼會發生? –

0


您可以使用下面的查詢

MERGE INTO TABLE1 T 
USING STMT S 
ON (T.UID = S.UID AND T.PID = S.PID) 
WHEN MATCHED THEN 
UPDATE 
SET 
T.VALUE1 = CASE WHEN T.VALUE2 > 0 OR (T.VALUE2 = 0 AND T.VALUE1 <> S.VALUE1) THEN S.VALUE1 END 
WHEN NOT MATCHED THEN 
INSERT INTO T (COLUMNS) (SELECT COLUMNS FROM S);