首页 > 解决方案 > 有没有办法编写一个 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,即officialIdentifierIdID。

但我不确定如何使用工厂 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 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。该语句已终止。

有没有办法用一个查询来修复所有坏行?

谢谢!

标签: sqlsql-servertsqlsql-server-2012

解决方案


这里的问题是您有多个记录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);

推荐阅读