当前位置: 首页 > 面试题库 >

MySQL / SQL:使用更新后的表本身中的相关子查询进行更新

易炳
2023-03-14
问题内容

我有一个一般性的问题,我将尝试通过一个例子来解释。

假设我有一个包含以下字段的表格:“ id”,“ name”,“ category”,“ appearances”和“ ratio”

我的想法是,我有几个项目,每个项目都与一个类别相关,并且多次“出现”。比率字段应包括类别中项目出现的总数中每个项目出现的百分比。

用伪代码,我需要以下内容:

  • 对于每个类别,
    找到与该 类别 相关的项目的总外观。例如,可以用(select sum("appearances") from table group by category)完成

  • 对于每个项目,
    将比率值设置为项目的外观除以为上述类别找到的总和

现在,我试图通过一个更新查询来实现这一目标,但似乎无法做到这一点。我认为我应该做的是:

update Table T    
set T.ratio = T.appearances /   
(    
select sum(S.appearances)    
from Table S    
where S.id = T.id    
)

但是MySQL在更新列中不接受别名T,而且我也没有找到其他方法来实现这一点。

有任何想法吗?


问题答案:

遵循我收到的两个答案(所有答案都没有完成,所以我写了自己的答案),最终我做了以下工作:

UPDATE Table AS target
INNER JOIN 
(
select category, appearances_sum
from Table T inner join (
    select category as cat, sum(appearances) as appearances_sum
    from Table
    group by cat
) as agg
where T.category  = agg.cat
group by category
) as source
ON target.category = source.category
SET target.probability = target.appearances / source.appearances_sum

它运作非常迅速。我也尝试了相关子查询,但是它慢得多(数量级),所以我坚持使用联接。



 类似资料:
  • 问题内容: 谁能看到以下查询出了什么问题? 当我运行它时,我得到: #1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第8行的’a where a.CompetitionID = Competition.CompetitionID’附近使用 问题答案: 主要问题是内部查询不能与外部语句上的子句相关,因为在内部子查询执行之前,where过滤器首先应用于要

  • 我试图使用NamedParameterJdbcTemplate batchupdate插入多条记录。我可以在insert语句中插入记录,而无需使用子查询。但是,当我使用子查询返回的时,请查找下面的代码以供参考, 在上面的代码中,我使用子查询从公司表中获取max(id)。如果使用此子查询,则返回错误。如果我删除并硬编码一些值它的工作很好。为什么batchupdate不接受子查询。我正在使用DB2数据

  • 问题内容: 我有两个表:表A和表B 表A和表B都有列。 表A和表B都有列。 表A的一列也称为。 检查条件: 如果表A“键” =恒定,则从表A检索RowId。 从中获取这些行ID,并检查这些行的字段是否>具有相同rowId的表B的> ModifiedAT字段。 Table没有重复的RowId,而Table具有。 我自己尝试的方法: 注意:另外,令我感到惊讶的是,如果我将硬编码值替换为“ 1”,它会起

  • 我对SQL不是很友好,所以我需要在一个表上编写一个SQL UPDATE/DELETE查询。要求如下。 表A: 1        Code1    价值1      8 2             代码2       价值2             2 4                代码3         价值3            8

  • 问题内容: 我必须更新一个值,该值由3个表的联接返回。 例子: 我想用其他在上述条件下加入的值来更新表的字段值。 如何在MS SQL Server中执行此操作? 问题答案: 为了清楚起见…该子句可以引用该子句中指定的表别名。所以在这种情况下是有效的 通用示例

  • 我需要更新我的数据库,它是基于locationId的多行软删除 当我运行查询时,我得到一个错误: 错误代码:1175。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项- 正如我所知,子查询将返回两条记录,因为子查询返回两条记录更新不会发生,但我如何解决这个问题。我试图解决这个问题,但没有成功。