Sql 将日期从另一个具有条件的表复制到列
我正在努力做到以下几点: 数据库中的一个表称为Sql 将日期从另一个具有条件的表复制到列,sql,sql-server,datetime,Sql,Sql Server,Datetime,我正在努力做到以下几点: 数据库中的一个表称为服务状态历史,该表有三列: service\u id-指与service\u状态相关的服务的id。(也不是外键,因为在本例中,关系是在JPA代码中完成的) state\u start列,该列具有DATETIME值,指示该行上的状态何时开始 state列,该列描述该历史记录条目的状态,并具有以下VARCHAR值:(STANDBY,进行中,完成) 数据库中的另一个表称为服务,该表有两个相关列: idBIGINT done\u日期DATETIME
服务状态历史
,该表有三列:
-指与service\u状态相关的服务的id。(也不是外键,因为在本例中,关系是在JPA代码中完成的)service\u id
列,该列具有state\u start
值,指示该行上的状态何时开始DATETIME
列,该列描述该历史记录条目的状态,并具有以下VARCHAR值:(state
,STANDBY
,进行中
)完成
服务
,该表有两个相关列:
BIGINTid
DATETIMEdone\u日期
service\u state\u history
表的列state\u start
更新services
中的done\u date
列,当行中的状态
列的值为完成
且服务中的服务id
值与服务
中的id
值匹配时
如何将其转换为SQL?因此,要获取将更新目标表的所有记录,您将使用以下生成的结果:
SELECT service_id, state_started, state
FROM service_state_history
WHERE state = 'DONE'
要执行更新
,您需要将此结果集连接到标识列上的目标表,并在更新中使用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'
可以通过连接或子查询完成。非常简单-但可能值得避免“过度更新”。例如,ssh可能有很多s的记录(我假设服务可能会运行多次),因此您可能只希望将s更新为匹配ssh的“最新”值(添加group by和max),并避免更新行已经是最新的s。这可能特别重要,因为红土上有触发器。我可以理解你的观点,原则上同意,但OP没有指定任何信息。如果没有更详细的问题,所有这些都将基于假设。100%同意-我仍然对最近的一些问题经验感到痛心,并认为在OP的想法中加入btw(或任何其他可能稍后阅读此内容的人)不会有伤害。