2015-04-07 24 views
-1

我試圖做到以下幾點:複製日期的一列從另一個表與標準

一個數據庫中的表稱爲service_state_history,該表有三列:

  • service_id - 它指的是與service_state相關的服務的id。 (這不是外鍵,因爲在這種情況下關係是在JPA代碼中完成的)。

  • state_started具有DATETIME值的列,指示該行何時開始狀態。

  • state柱其描述了歷史條目的狀態,並具有以下VARCHAR值:(STANDBYIN PROGRESSDONE

在數據庫中的其它表稱爲services,該表具有兩個相關欄目:

  • id BIGINT
  • done_date DATETIME

現在,我應該做的是更新從service_state_history表的列state_started,當state列的行中的值是DONEservicesdone_date列和services在比賽idservice_id值。

這是如何轉化爲SQL的?

+0

可以使用JOIN或子查詢來完成。 –

回答

1

因此,要獲得所有將要更新的目標表中的記錄,您將使用所產生的結果:

SELECT service_id, state_started, state 
FROM service_state_history 
WHERE state = 'DONE' 

要執行UPDATE你需要JOIN這個結果集到目標表上身份列並在更新中使用state_started。例如:

UPDATE s 
SET s.done_date = ssh.state_started 
FROM services s 
INNER JOIN service_state_history ssh ON ssh.service_id = s.id 
WHERE ssh.state = 'DONE' 
+0

完美直接 - 但它可能是值得的,以避免「過度更新」。例如,ssh可能有很多記錄(我假設服務可能會多次運行),所以您可能只想將s更新爲匹配ssh的「最新」值(通過添加一個組和max ),並避免在行已經是最新的地方更新。在s上有觸發器的地方,這可能特別重要。 – Clay

+0

@Clay我可以看到你的觀點並且原則上同意,但是OP沒有指定任何這些信息。沒有更詳細的問題,所有這些都將基於假設。 – Tanner

+2

同意100% - 我仍然從最近的一些問題的經驗中明白,並且認爲將OPT的想法(或任何其他人可能會在稍後閱讀這篇文章)中引用btw並無害處。 – Clay

相關問題