Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将日期从另一个具有条件的表复制到列_Sql_Sql Server_Datetime - Fatal编程技术网

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
    -指与service\u状态相关的服务的id。(也不是外键,因为在本例中,关系是在JPA代码中完成的)

  • state\u start
    列,该列具有
    DATETIME
    值,指示该行上的状态何时开始

  • state
    列,该列描述该历史记录条目的状态,并具有以下VARCHAR值:(
    STANDBY
    进行中
    完成

数据库中的另一个表称为
服务
,该表有两个相关列:

  • id
    BIGINT
  • done\u日期
    DATETIME
现在,我要做的是从
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(或任何其他可能稍后阅读此内容的人)不会有伤害。