您的位置:首页 > 数据库 > MySQL

按照条件在两个表之间拷贝数据 for mysql & sqlserver

2016-09-06 11:44 369 查看

业务讲解

alarmeventlog(简称ael)表示一条报警信息;

alarmclientlog(简称acl)表示操作员对报警的处理记录,同一报警可能有多条处理记录。

ael与acl是一对多的关系,通过各自的strIndex和strUniqueTime关联。

acl.HandleTime表示每个操作员的处理时间。

现需要将acl中对应最新的一条记录拷贝到ael中去。

代码实现

因要支持两种数据库,且数据库之间存在语法限制,因此需要分别实现。

mysql的实现

UPDATE alarmeventlog ael SET ael.nState = IFNULL(
(SELECT
acl.nState
FROM alarmclientlog acl
WHERE ael.strIndex = acl.strIndex
AND ael.strUniqueTime = acl.strUniqueTime
GROUP BY acl.strIndex
ORDER BY acl.HandleTime), ael.nState
);


语句讲解:

IFNULL(符合条件的结果,不符合条件的结果)


找到最新的一条记录:
GROUP BY acl.strIndex       -- 对应多条记录,分组以后可以拿到一条记录
ORDER BY acl.HandleTime     -- 找到多条记录中时间最新的一条,在GROUP时将被选中


sqlserver的实现

UPDATE alarmeventlog SET alarmeventlog.nState = ISNULL(
(
SELECT
alarmclientlog.nState
FROM alarmclientlog
WHERE alarmeventlog.strIndex = alarmclientlog.strIndex
AND alarmeventlog.strUniqueTime = alarmclientlog.strUniqueTime
), alarmeventlog.nState
);


语句讲解:

ISNULL(符合条件的结果,不符合条件的结果)


注意:由于sqlserver语法限制,不能在子语句中使用GROUP BY和ORDER BY,因此ael中的结果将是acl中任意一条,而不是最新一条。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql sqlserver