有没有一种方法可以编写 UPDATE 语句来修复包含错误数据的多行?

Is there a way to write an UPDATE statement to fix multiple rows with bad data?

我正在尝试修复 SQL 服务器数据库中的数据错误。

有些值使用了来自错误工厂的错误 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 table 中有一个共同的 ID,那就是 officialIdentifierId ID。

但我不确定如何更改 machineParts table 中所有行的 partIds 来自工厂 88 和 89 以及新工厂 100 partIds。

machineParts table 看起来像这样:

machineId       partId
----------------------
7623741         123 
8927661         124
6471982         125

所以如果一台机器有一个来自工厂 88 或 89 的旧 partId,我需要用来自工厂 100 的 partId 替换它。

partsCatalog table 具有 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

因此修复后正确的机器部件 table 应该如下所示:

machineId       partId
----------------------
7623741         125
8927661         125
6471982         125

我试过这个更新语句来修复所有坏行:

UPDATE machineParts SET partID = (SELECT partID FROM  partsCatalog WHERE factoryId = 100)
WHERE partID IN(123, 124)

但是我得到这个错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. The statement has been terminated.

有没有一种方法可以通过一次查询修复所有坏行?

谢谢!

这里的问题是您有多个 factoryId = 100 的记录。您可以使用如下所示的 TOP 1“修复”此问题,但您必须确定 partID 在所有记录上与子查询的 factoryId:

相同
UPDATE machineParts SET partID = (SELECT TOP(1) partID FROM  partsCatalog WHERE factoryId = 100)
WHERE partID IN(123, 124);

这表示“只要给我 first 记录中的 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);

factory 100 是否只有一个零件的 officialIdentifierId 为 A-00-900c?

如果是,

UPDATE machineParts 
    SET partID = (SELECT partID 
                  FROM  partsCatalog 
                  WHERE factoryId = 100
                    AND officialIdentifierId = 'A-00-900c'
                 )
WHERE partID IN (123, 124)