2016-09-08 37 views
1

我正在更新另一個表中的Oracle表,然後需要使用sysdate爲所有已更新的行更新date_modified字段。我的代碼目前看起來像這樣:如何在更新另一行後用sysdate更新date_modified?

UPDATE 
table1 t1 
SET 
field1 = (SELECT t2.value 
      FROM table2 t2 
      WHERE t1.r_id = t2.r_id 
      AND t2.other in (2,3,4)) 
WHERE EXISTS (
SELECT 1 
FROM table2 t2 
WHERE t1.r_id = t2.r_id 
AND t2.value IS NOT NULL); 

如何添加將date_modified更新到sysdate的命令?我試過了第二個更新命令,但這是更新整個表。當我嘗試添加條款,如:

set 
date_modified = sysdate (WHERE t2.value IS NOT NULL 
         AND t2.other in (2,3,4)) 

這似乎無法引用T2和完整的表名寫也不行。

這是可能的SQL?我知道我不能在更新語句中使用JOIN,我不確定是否有其他規則阻止我這樣做。

感謝

+0

我建議爲此使用觸發器。 –

回答

2
update table1 t1 
set 
    field1 = (...) 
, date_modified = sysdate -- << ADD 
where exists... 
+0

我的投票會讓你的聲望超過5000.你欠我一杯啤酒。 –

+0

@DanBracuk哈哈 - 啤酒批准了,如果我聲名狼借,可能會更多。 – mathguy

0

也許這你想要做什麼:

UPDATE table1 t1 
SET field1 = (SELECT t2.value 
       FROM table2 t2 
       WHERE t1.r_id = t2.r_id AND t2.other in (2,3,4) 
      ), 
    data_modified = sysdate 
WHERE NOT EXISTS (SELECT t2.value 
        FROM table2 t2 
        WHERE t1.r_id = t2.r_id AND t2.value IS NOT NULL AND 
         t1.field1 = t2.value 
       ); 

注意微妙的變化到WHERE條款。這可以確保新值與舊值不同。

0


非常好的問題。在這裏你可以使用Case語句,

UPDATE table1 t1 set field1 = (SELECT t2.value 
     FROM table2 t2 
     WHERE t1.r_id = t2.r_id 
     AND t2.other in (2,3,4)) 
WHERE EXISTS (
SELECT 1 
FROM table2 t2 
WHERE t1.r_id = t2.r_id 
AND t2.value IS NOT NULL), 
date_modified = case when t2.value IS NOT NULL 
        AND t2.other in (2,3,4) then sysdate 

希望你能去。否則讓我知道會幫助你。