我有一个一般性的问题,我将尝试通过一个例子来解释。
假设我有一个包含以下字段的表格:“ 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。您使用的是安全更新模式,并且您试图更新一个没有使用键列禁用安全模式的表,请在“首选项”中切换该选项- 正如我所知,子查询将返回两条记录,因为子查询返回两条记录更新不会发生,但我如何解决这个问题。我试图解决这个问题,但没有成功。