如何更新子查询中的更多行?

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
                      );

如果您只想更新匹配ShuttleIds 的行,请使用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】:

我建议使用updateexists,如下所示:

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(...) 列将“行位置”添加到查询中?

更新表时如何改进 Spark 中的 SQL 查询? (子查询中的'NOT IN')

子查询返回超过 1 个值 - 我的触发器无法处理多个行更新

SQL WHERE EXISTS 掩盖了子查询中的错误

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数