表结构相同的表,获取列值不同的列名

表结构相同的表,获取列值不同的列名

背景

现有两个表表结构相同,两个表的数据id是一一对应的,由于一些原因导致了两个表部分列的值不一样,现在想最小化程度的更新,去保证两个表的列数据统一.

解决思路

  • 先关联两个表,根据id字段使两张表的数据一一对应,对应的数据做一个伪表
  • 利用伪表和switch case 语句完成列值的判断和获取相应列名

基础表结构和SQL

  • 基础表结构
create table table1
(
    id   int auto_increment comment '唯一id'
        primary key,
    name varchar(32),
    age  int,
    sex  varchar(8)
); 

create table table2
(
    id   int auto_increment comment '唯一id'
        primary key,
    name varchar(32),
    age  int,
    sex  varchar(8)
); 
  • 存储过程初始化数据
delimiter $$
CREATE PROCEDURE GenerateRandomData()
BEGIN
    DECLARE i int default 0;
    while i < 100
        do
            insert into table1(name, age, sex)
                values (CONCAT('Person', 1), FLOOR(RAND() * 80 + 18),
                        IF(FLOOR(RAND() * 2) = 0, 'Male', 'Female'));
        set i = i +1;
    end while;
end $$;
delimiter ;

call GenerateRandomData();
  • 具体sql
WITH CTE AS (
  SELECT DISTINCT t.id AS tid, t.name AS tname, t.age AS tage, t.sex AS tsex,
                  t1.name AS t1name, t1.age AS t1age, t1.sex AS t1sex
  FROM table1 t
  JOIN table2 t1 ON t.id = t1.id
)
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table1'
  AND COLUMN_NAME IN ('name', 'age', 'sex')
  AND (
    SELECT COUNT(*)
    FROM CTE
    WHERE
      CASE
        WHEN COLUMN_NAME = 'name' THEN tname != t1name
        WHEN COLUMN_NAME = 'age' THEN tage != t1age
        WHEN COLUMN_NAME = 'sex' THEN tsex != t1sex
      END
  ) > 0;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值