2015-04-07 21 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

相关问题