MySQL中将A表中的字段值赋值给B表中的字段

  在工作中设计到一些字段值的初始化,特别是生产系统中添加字段时处理历史数据的初始化,往往需要更新字段值,这里说说将A表中的字段值赋值给B表中的字段的几种更新方法。

  1、通过子查询实现

UPDATE tableA a
SET a.column1 = (
    SELECT
        b.column1
    FROM
        tableB b
    WHERE
        a.id = b.aid
),
 a.column2 = (
    SELECT
        b.column2
    FROM
        tableB b
    WHERE
        a.id = b.aid
)
WHERE
    EXISTS (
        SELECT
            1
        FROM
            BtableB c
        WHERE
            a.id = c.aid
    );

 

  2、通过逗号操作符的内连接

UPDATE tableA a,
 tableB b
SET a.column1 = b.column1,
 a.column2 = b.column2
WHERE
    a.id = b.aid;

  3、各种内、外连接都可以实现

UPDATE tableA a
LEFT JOIN tableB b ON a.id = b.aid
SET a.column1 = b.column1,
 a.column2 = b.column2;

 

  4、SQL允许的各种连接,并根据CASE函数控制不同类型数据更新不同的值

UPDATE system_alarm s LEFT JOIN (
SELECT a.id aid,
(
CASE a.alarm_type
WHEN '1' THEN d.p1_min
WHEN '2' THEN d.p1_max
WHEN '5' THEN d.p2_min
WHEN '6' THEN d.p2_max
ELSE 0
END
) AS num
 FROM system_alarm a LEFT JOIN device d ON a.device_id=d.device_id
) aaa
 ON s.id=aaa.aid
SET s.threshold=aaa.num;

 

  这里没有用伪SQL,因为结合实际业务更好理解,大概说一下这条SQL的实际业务逻辑:设备的报警表中添加了新的字段:threshold(阈值),用来保存报警时的阈值,需要根据不同的报警类型把历史报警的对应阈值放入新字段中,这里统一把当前的设备阈值保存到新字段,因修改过阈值而产生的不合理数据另外进行针对性的处理。

 

posted @ 2021-06-01 15:35  胜金  阅读(3206)  评论(0编辑  收藏  举报