有没有一种方法可以编写 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)
我正在尝试修复 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)