用于从 N 记录的其他表值更新值的 SQL 查询
Posted
技术标签:
【中文标题】用于从 N 记录的其他表值更新值的 SQL 查询【英文标题】:SQL Query for Updating value from other table values for N records 【发布时间】:2018-05-09 13:31:09 【问题描述】:我在历史表的数字列中有一些错误的条目,所以我必须从汽车表中获取数字列的值并在历史表中更新。下面的查询我用于更新,
UPDATE history
SET history.number = (SELECT motorvehicle.number
FROM motorvehicle
WHERE motorvehicle.FK_ID = history.FK_ID
AND history.DATE = '2018-05-08'
AND history.state = 35 fetch first 1000 rows only)
当我运行此查询时,我收到类似“[21000] [IBM][DB2/AIX64] SQL0811N: The result of a scalar fullselect, the SELECT INTO statement, or the VALUES INTO statement contains more than one行”。
如果我只从查询中删除前 1000 行,它不会给出任何语法错误,但由于事务日志已满而失败。
我的数据库是 Db2-LUW V10.5,在 Linux 服务器上运行。
谁能帮我解决这个问题?如果上述查询不是正确的更新方式,您可以根据我的情况提出一些新的查询吗?
【问题讨论】:
似乎 motorvehicle 至少包含几行具有相同 FK_ID 值的行。子查询中的那些 history.date 和 history.state 条件看起来很奇怪。 有些谓词错误。关系是如何定义的?如何识别错误的数字? @jarlh history.number 值在 2018 年 5 月 8 日错误地更新为 history.state = 35 的记录。这就是我在子查询中包含此条件的原因。我检查了机动车表,FK_ID 没有重复项。 在更新版本之前和之后添加一些示例表数据。作为格式化文本,而不是图像。 【参考方案1】:我在使用 oracle 和 SQL 开发人员时遇到了同样的问题,因为子查询返回多个历史记录。例如:对于 ID 1,历史记录中恰好有 1 个匹配项,因此它运行良好,但对于 ID 2500,查询匹配多个记录,这些记录在中途引发异常。为了解决这个问题,我需要在子查询中添加更多规范条件和 rownum =1。
在您的情况下,仅获取前 1000 行:它应该是 1。
【讨论】:
感谢您的回复。现在我应该在我的查询中修改什么......我应该将“仅获取前 1000 行”更改为“仅获取前 1 行”......然后它将只返回一行权利 是的 :) 如果 oracle 你可以使用 rownum = 1 。这将确保返回最多 1 条记录。为了更安全,您需要再添加 1 次检查历史记录表中是否存在记录。不要忘记标记 ans :))以上是关于用于从 N 记录的其他表值更新值的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
在 T-SQL 查询的 SELECT 子句中使用表值函数的“语法不正确”