如何将DB表中Timestamp大于Summary表最大Timestamp的行插入Summary表?
解决将DB表中符合时间条件的数据插入Summary表的问题
需求说明
现有两张表:
- Summary表:包含
ID、NAME、TIMESTAMP字段,当前数据如下:
| ID | NAME | TIMESTAMP |
|---|---|---|
| 1 | A | 2018-06-28 15:12:46 |
| 2 | B | 2018-06-28 16:12:46 |
| 3 | C | 2018-06-28 18:12:46 |
- DB表:结构与Summary表一致,当前数据如下:
| ID | NAME | TIMESTAMP |
|---|---|---|
| 1 | D | 2018-06-28 15:12:46 |
| 2 | E | 2018-06-28 19:12:46 |
| 3 | F | 2018-06-28 22:12:46 |
需要将DB表中TIMESTAMP大于Summary表最大TIMESTAMP(即2018-06-28 18:12:46)的行插入到Summary表,最终得到的Summary表数据如下:
| ID | NAME | TIMESTAMP |
|---|---|---|
| 1 | A | 2018-06-28 15:12:46 |
| 2 | B | 2018-06-28 16:12:46 |
| 3 | C | 2018-06-28 18:12:46 |
| 2 | E | 2018-06-28 19:12:46 |
| 3 | F | 2018-06-28 22:12:46 |
原SQL的问题
你尝试的SQL语句存在两个关键错误:
- WHERE子句不能直接使用聚合函数:
MAX(SUMMARY.timestamp)是聚合函数结果,无法直接在WHERE中作为筛选条件,需要通过子查询单独获取。 - 错误的表连接方式:使用逗号连接DB和SUMMARY表会产生笛卡尔积,完全偏离了筛选DB表数据的需求。
正确的SQL语句
基础版本(Summary表非空时)
通过子查询获取Summary表的最大时间戳,再筛选DB表中符合条件的数据插入:
INSERT INTO SUMMARY (ID, NAME, TIMESTAMP) SELECT ID, NAME, TIMESTAMP FROM DB WHERE DB.TIMESTAMP > (SELECT MAX(TIMESTAMP) FROM SUMMARY);
兼容空表的版本
如果Summary表可能为空,MAX(TIMESTAMP)会返回NULL,此时可以用COALESCE设置一个默认的起始时间,确保所有DB表数据都能插入:
INSERT INTO SUMMARY (ID, NAME, TIMESTAMP) SELECT ID, NAME, TIMESTAMP FROM DB WHERE DB.TIMESTAMP > COALESCE((SELECT MAX(TIMESTAMP) FROM SUMMARY), '1970-01-01 00:00:00');
效果验证
执行上述SQL后,DB表中TIMESTAMP大于2018-06-28 18:12:46的E、F两行会被插入到Summary表,结果与预期一致。
内容的提问来源于stack exchange,提问作者mark dan
相关产品推荐
相关产品推荐

