如何更新子查询中的更多行?
Posted
技术标签:
【中文标题】如何更新子查询中的更多行?【英文标题】:How can I UPDATE more rows in a subquery? 【发布时间】:2020-12-10 13:59:23 【问题描述】:我有 2 个表 - Rawdata 和 Cleandata
Rawdata 定期获取 id 和距离
INSERT INTO rawdata (`ShuttleID`, `Distance`) VALUES ('1', '50');
INSERT INTO rawdata (`ShuttleID`, `Distance`) VALUES ('1', '50');
INSERT INTO rawdata (`ShuttleID`, `Distance`) VALUES ('2', '100');
INSERT INTO rawdata (`ShuttleID`, `Distance`) VALUES ('2', '100');
Cleandata 只有一个 id。
INSERT INTO cleandata (`ShuttleID`, `Distance`) VALUES ('1', '0');
INSERT INTO cleandata (`ShuttleID`, `Distance`) VALUES ('2', '0');
原始数据中会有很多条目。我的想法是求和(距离)并使用更新到 cleandata 中的距离。
UPDATE cleandata cd, rawdata rd SET cd.Distance = cd.Distance + (SELECT sum(Distance) FROM rawdata GROUP BY ShuttleID)
当我只放置一个 ShuttleID 时,我的查询正在工作。如果我放置更多 ID,则会出现错误
错误代码:1242。子查询返回多于 1 行
我理解它,因为当我有更多的 id 时,Select 语句会给我更多的行
我现在的问题是:如何确定从 Rawdata 到 Cleandata 的正确距离?
【问题讨论】:
【参考方案1】:如果我理解正确,您可以使用相关子查询:
UPDATE cleandata cd
SET cd.Distance = (SELECT SUM(rd.Distance)
FROM rawdata rd
WHERE rd.ShuttleId = cd.ShuttleID
);
如果您只想更新匹配ShuttleId
s 的行,请使用JOIN
:
UPDATE cleandata cd JOIN
(SELECT ShuttleId, SUM(rd.Distance) as sum_distance
FROM rawdata rd
GROUP BY rd.ShuttleId
) rd
ON rd.ShuttleId = cd.ShuttleID
SET cd.Distance = rd.sum_distance;
如果您想包含当前距离(而不仅仅是计算),那么:
UPDATE cleandata cd JOIN
(SELECT ShuttleId, SUM(rd.Distance) as sum_distance
FROM rawdata rd
GROUP BY rd.ShuttleId
) rd
ON rd.ShuttleId = cd.ShuttleID
SET cd.Distance = cd.Distance + rd.sum_distance;
【讨论】:
【参考方案2】:我建议使用update
和exists
,如下所示:
UPDATE cleandata c
SET c.Distance = (select SUM(r.Distance)
FROM rawdata r
WHERE r.shuttleid = c.shuttleid
)
Where exists (select 1 from rawdata rr
Where rr.shuttleid = c.shuttleid);
【讨论】:
以上是关于如何更新子查询中的更多行?的主要内容,如果未能解决你的问题,请参考以下文章
带有子查询的 CTE 查询在小型索引表上很慢;如何在 MySQL 上进行优化?
如何使用子查询中的 SUM(...) 列将“行位置”添加到查询中?