sql - 有没有办法编写一个 UPDATE 语句来修复包含错误数据的多行?
问题描述
我正在尝试修复 SQL Server 数据库中的数据错误。
有些值使用了来自错误工厂的错误 partId。
我可以获得所有带有错误部件的机器的列表,如下所示:
---machines using wrong parts from wrong factory 88 and 89:
SELECT ml.machineId, ml.machineName, mp.machineId, mp.partId, pc.officialIdentifierId
FROM industry.machineParts mp
INNER JOIN partsCatalog pc ON mp.partId = pc.partId
INNER JOIN machineList ml ON mp.machineId = ml.machineId
WHERE pc.factoryId IN (88,89)
我有一个在 machineParts 表中常见的 ID,即officialIdentifierId
ID。
但我不确定如何使用工厂 88 和 89 中的新工厂 100 partIds 更改 machineParts 表中的所有行。
machineParts 表如下所示:
machineId partId
----------------------
7623741 123
8927661 124
6471982 125
所以如果一台机器有一个来自工厂 88 或 89 的旧 partId,我需要用工厂 100 的 partId 替换它。
partsCatalog 表具有 factoryId 值,如下所示:
partId | name | factoryId | officialIdentifierId
--------------------------------------------------------------
123 OilFil 88 A-00-900c
124 O_Filter 89 A-00-900c
125 Oil Filter 100 A-00-900c
因此,修复后正确的 machineParts 表应如下所示:
machineId partId
----------------------
7623741 125
8927661 125
6471982 125
我尝试了这个更新语句来修复所有坏行:
UPDATE machineParts SET partID = (SELECT partID FROM partsCatalog WHERE factoryId = 100)
WHERE partID IN(123, 124)
但我得到这个错误:
子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。该语句已终止。
有没有办法用一个查询来修复所有坏行?
谢谢!
解决方案
这里的问题是您有多个记录factoryId = 100
。您可以使用如下所示的 TOP 1 来“修复”此问题,但您必须确定partID
所有带有子查询的记录都是相同的factoryId
:
UPDATE machineParts SET partID = (SELECT TOP(1) partID FROM partsCatalog WHERE factoryId = 100)
WHERE partID IN(123, 124);
这表示“只需将第一条记录上的 partID 与 factoryId 100 一起给我”。您还可以调整子查询以提供最新的子查询,假设有一个createdOn
字段作为示例:
UPDATE machineParts SET partID = (SELECT TOP(1) partID FROM partsCatalog WHERE factoryId = 100 ORDER BY createdOn DESC)
WHERE partID IN(123, 124);
推荐阅读
- php - Codeigniter 通过按钮向数据表提交 Ajax 结果不起作用
- java - Hashmap 与 AssertEquals 不匹配
- python-3.7 - 如何在python中获取环境文件?
- c - 为什么 malloc 返回一个指针?
- spring-boot - 多个 Spring Kafka Consumer 一类 多组
- php - 以正确的方式在codeigniter中路由
- javascript - 选择要提交的特定表
- azure-active-directory - AAD - 所有者密码凭证流
- javascript - 如何使用 Jquery 在下拉菜单上更改 div css/scss?
- regex - 索引数据范围并与列进行比较,然后从同一列返回第一个可用选项