2011-08-25 69 views
0

假設我有一行a,b,c, d & time_stamp字段,其​​中a是唯一鍵,而d表示「已刪除」行(我並不真正刪除,因爲我想要保持它的審計線索)。如何用最新的時間戳更新行

如果我修改行,我不會只是更新,因爲我想保持審計線索。相反,我會將最接近的行標記爲被刪除,然後插入一個新行(我希望我已經清楚地描述了這一行)。

現在,(如何)我可以用一個SQL staement更新最近一行(by time_stamp)where a =?

也許像

UPDATE <table> 
    SET d="Y" 
    WHERE a=<some value> AND time_stamp=MAX(time_stamp) 

是正確的?它能做得更好嗎?感謝您的幫助

+2

你說'a'是唯一的關鍵,所以你可以單獨使用它在where子句 –

+0

+1的評論。我只記得它不再是單一的。它曾經是,但是爲了添加auti trail,我不再刪除行,只是將「已刪除」字段標記爲「Y」,而不是添加新行。 – Mawg

回答

1

試試這個:

UPDATE TestTable 
SET D= Y 
FROM (
     SELECT MAX(Time_Stamp) as MaxTimeStamp 
     FROM TestTable 
     WHERE A=x 
    ) t 
WHERE t.Time_Stamp = TestTable.MaxTimeStamp 

只要確保你的時間戳足夠精確的活動水平在t能夠確定沒有2行具有相同的A和time_stamp值。如果您有> 1行具有相同的時間戳和A值,那麼您可能更新的不僅僅是最近的一行。

+0

+1謝謝;我終於掙扎着穿過它,它是合適的。作爲第一個答覆,你會得到答案 – Mawg

+0

順便說一句,在momemnt 1秒的決議似乎是好的,因爲數據庫內容是由人類的自我規劃通過broowser創建的。爲了在未來的項目上獲得更多的準確性,我想我可以使用一個自動壓縮字段,可以結合tiemstamp嗎? – Mawg

+0

您可以創建一個準確的自動增量標識列。在MSSQL中,這可以很容易地完成,雖然我不確定MySQL中的等價物,所以我沒有把它留在我的答案中。與MSSQL中的時間戳數據類型一樣。 –

1

嘗試

UPDATE MyTable T 
SET T.d="Y" 
WHERE T.a=<some value> AND 
T.time_stamp=(SELECT MAX(T2.time_stamp) FROM MyTable T2 WHERE T2.a = T.a) 

IF a是唯一的和/或PK那麼就可以做更容易/更好:

UPDATE MyTable T 
SET T.d="Y" 
WHERE T.a=<some value> 
+0

+1非常感謝。你的第一個解決方案看起來像@ wt_w's,只是不同而已。正確?我恐怕A不可能是唯一的。 Nothig可以(除了他最近的每一行,因爲我想要審計線索)。嗯,我想我會問一個關於審計線索的問題。再次感謝 – Mawg