You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用UPDATE从table2更新table1未得多行结果,求正确实现方法

问题:如何将Table2的多行数据同步到Table1?

我知道类似问题有现成解答,但按解答操作后没得到预期结果。现有两张表:

Table1结构与初始数据

CREATE TABLE table1 (session_id INT, timestamp INT, track DOUBLE PRECISION);

INSERT INTO table1 (session_id) VALUES (106502),(137226),
  (114701),(124942),(155663)

Table2结构与数据

CREATE TABLE table2 (session_id INT, seconds INT, lat DOUBLE PRECISION,
  lon DOUBLE PRECISION, track DOUBLE PRECISION);

INSERT INTO table2 (session_id, seconds, lat, lon, track)
VALUES ( 106502, 1462559236, 41.1726876, -8.5985753,150),
     (106502, 1462559237, 41.1726365, -8.5985595, 155),
     (106502, 1462559238, 41.1725735, -8.5985308,156),
     (106502, 1462559239, 41.1725079, -8.5984963, 156),
     (106502, 1462559240, 41.1724459, -8.5984539, 154),
     (137226, 1513974852, 41.1078345, -8.6268529, 194),
     (137226, 1513974853, 41.1077562,-8.6268664, 184),
     (137226, 1513974854, 41.1076747,-8.6268582, 173),
     (114701, 1467878080, 41.1654988, -8.6027799, 69),
     (114701, 1467878081, 41.1655208, -8.6027348, 49)

Table1的timestamp和track列目前为空,我尝试用以下SQL从Table2更新这些列:

UPDATE table1 t1
   SET timestamp = t2.seconds, 
       track = t2.track
from table2 t2
where t1.session_id = t2.session_id

实际执行结果

session_id | timestamp | track
-----------+-----------+------
124942     |           |
155663     |           |
106502     |1462559236 | 150
114701     |1467878081 | 49
137226     |1513974854 | 173

预期结果

session_id | timestamp | track
-----------+-----------+------
124942     |           |
155663     |           |
106502     |1462559236 | 150
106502     |1462559237 | 155
106502     |1462559238 | 156
106502     |1462559239 | 156
106502     |1462559240 | 154
137226     |1513974852 | 194
137226     |1513974853 | 184
137226     |1513974854 | 173
114701     |1467878080 |  69
114701     |1467878081 |  49

解决方案

UPDATE语句的作用是修改现有行,每个session_id在Table1中只有一行,因此即使关联到Table2的多行数据,最终只会保留最后匹配的那一行的值(不同数据库可能取任意一行,但结果都是单条)。要实现多行结果,需要用INSERT ... SELECT语句插入新行:

方法:插入Table2对应数据到Table1

直接将Table2中与Table1存在匹配session_id的记录插入到Table1,同时保留原Table1中无匹配的空行:

INSERT INTO table1 (session_id, timestamp, track)
SELECT t2.session_id, t2.seconds, t2.track
FROM table2 t2
JOIN table1 t1 ON t2.session_id = t1.session_id;

如果需要先清除Table1中已关联的旧数据(避免重复行),可以先执行删除:

DELETE FROM table1
WHERE session_id IN (SELECT DISTINCT session_id FROM table2);

再执行上面的插入语句即可得到预期结果。


内容的提问来源于stack exchange,提问作者arilwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:35:15