sql - 当我得到 2 个或更多具有相同值的值时,仅更新 1 个(查询找到的第一个)值的方法?

Posted

技术标签:

【中文标题】sql - 当我得到 2 个或更多具有相同值的值时,仅更新 1 个(查询找到的第一个)值的方法?【英文标题】:sql - way to only update 1 (the first the query finds) value when i got 2 or more with the same value? 【发布时间】:2014-12-05 19:38:43 【问题描述】:

我在 java 中有这段代码来替换我的高分表中的最低分数,但是如果我有两个或更多相同分数并且它是表中的最低分数,它将替换所有这些,但我只想替换其中的 1 个(其中任何一个)。

PreparedStatement PreparedStatement = conn.prepareStatement("UPDATE Highscore SET Name = ?, 分数 = ?, 时间 = ?, 等级 = ? WHERE Score = (SELECT TOP 1 Score FROM Highscore ORDER BY Score > ASC)");

preparedStatement.setString(1, name);

preparedStatement.setInt(2, score);

preparedStatement.setInt(3, time);

preparedStatement.setString(4, level);

int updateCount =preparedStatement.executeUpdate();

如果有办法只更新 1(查询找到的第一个)值,当我得到 2 个或更多具有相同值的值时,我会感到很痛苦。

【问题讨论】:

【参考方案1】:

这似乎不是一个与 Java 相关的问题,而是一个与数据库设计相关的问题。

通俗地说,表中的每一行都必须是唯一可识别的(根据关系模型理论);这称为数据完整性。实现这一点的最简单方法是在表中添加一个属性作为主键。

通常,主键是一个从 1 开始的整数,并随着您在表中添加的每一行而递增。

现在来回答您的问题:只需向您的表添加一个主键,然后您的“位置”条件可以修改为:

UPDATE Highscore 
SET Name = ?, Score = ?, Time = ?, Level = ? 
WHERE PrimaryKey = (SELECT TOP 1 PrimaryKey FROM Highscore ORDER BY Score)

请注意,“where”条件会从您的分数中获取主键,为简单起见称为“PrimaryKey”,然后会更新。

【讨论】:

【参考方案2】:

一种简单的方法是拆分您的查询?所以你得到了,比如说,id,然后进行更新。

否则,请检查:

 UPDATE Table 
 SET Field = Whatever     
 WHERE id = (SELECT TOP 1 id FROM Highscore ORDER BY Score ASC)

【讨论】:

以上是关于sql - 当我得到 2 个或更多具有相同值的值时,仅更新 1 个(查询找到的第一个)值的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 在更新数组时不存储两个相同的值

获取具有2个或更多条件的foreach循环的值

循环遍历Series以查找具有相同索引值的

如何提取具有相同文件夹结构的档案以便合并文件夹内容?

当有两个相同的值时,SQL UPDATE SET一列等于0.000

等于 (=) 和具有一个文字值的 IN 之间的性能差异