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

3 篇文章 0 订阅
2 篇文章 0 订阅

业务讲解

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中任意一条,而不是最新一条。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值