我正在try 总结来自两个数据源的一些数据.表格如下

t1

auto_id unique_column value
1 d1 10
2 d2 5
3 d3 15

t2

auto_id unique_column value
null d3 5
null d4 6

查询后t1中的预期数据:

auto_id unique_column value
1 d1 10
2 d2 5
3 d3 20
4 d4 6

为了解决这个问题,我计划执行以下查询

REPLACE INTO t1
SELECT auto_id, unique_column, SUM(value) value FROM 
(
  SELECT * FROM t1
  UNION ALL 
  SELECT * FROM t2
) GROUP BY unique_column; 

此查询的问题

SELECT auto_id, unique_column, SUM(value) value FROM 
(
  SELECT * FROM t1
  UNION ALL 
  SELECT * FROM t2
) GROUP BY unique_column; 

上面的查询将给我们

auto_id unique_column value
1 d1 10
2 d2 5
3 d3 20
NULL d4 6

这没关系.在插入查询中,我们将得到以下结果:

auto_id unique_column value
1 d1 10
2 d2 5
3 d3 20
4 d4 6

但下面的查询

SELECT auto_id, unique_column, SUM(value) value FROM 
(
  SELECT * FROM t2
  UNION ALL 
  SELECT * FROM t1
) GROUP BY unique_column; 

会给我们

auto_id unique_column value
1 d1 10
2 d2 5
NULL d3 20
NULL d4 6

因此,插入查询将产生以下意外结果

auto_id unique_column value
1 d1 10
2 d2 5
3 d3 15
4 d3 20
5 d4 6

另一种 idea 是,full outer join,但mysql决定不实现这个.mysql还可以做什么其他替代方案?

推荐答案

你很接近:

REPLACE INTO t1
SELECT MAX(auto_id), unique_column, SUM(value) value FROM 
(
  SELECT * FROM t1
  UNION ALL 
  SELECT * FROM t2
) t
GROUP BY unique_column;

MAX(auto_id)将跳过NULL个字段,这将为'd3'提供3;对于'd4'的情况,auto_id仍然是NULL,但是(只要该列被声明为AUTO_INCREMENT NOT NULL),NULL将被序列中的下一个数字替换.

编辑您的编辑:只要您使用MAX(或MIN)正确聚合auto_id,唯一出现的情况NULL是您没有之前的auto_id;它对订购不敏感.

Mysql相关问答推荐

使用由其中一个表的列规定的条件连接两个表

无法连接到扩展坞MySQL Unix套接字

Mysql时间序列数据的最小值和最大值

Select 最高等级最多的部门名称

MySQL:根据条件查找某些用户的行位置

为什么order by子句可以利用索引?

有人可以帮我用 R 编程解决这个问题吗?

在 SQL 中将列添加为 End_date,间隔为 +100 天

保存SQL查询的中间结果

查询给出错误时的 mySQL Group_Concat 和 Case

什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

通过数据库级​​别本身的查询反序列化

重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是什么?

为什么数据库行元组中的整数具有L后缀?

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取用户'root'@'localhost'的访问被拒绝(使用密码:YES)

MySQL在哪里存储数据库文件?

将 UTF8 表上的 latin1 字符转换为 UTF8

来自 MySQL 中多个表的 COUNT(*)

AWS RDS 实例升级停机时间