3

我知道这看起来像是重复的,但我一直在处理看起来相似的问题,但我仍然无法克服这个错误。

我不明白为什么这个 SQL UPDATE 查询返回“子查询返回超过 1 个值”错误。

UPDATE ph
SET ph.manufacturerPartNumber = t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

涉及的数据如下。

SELECT t.partID,t.DocID,ph.partID,ph.manufacturerPartNumber
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

在此处输入图像描述

我不明白“超过 1 个值”的来源。来自 t 的每个 partID 在 ph 中恰好有 1 个 partID。

我也尝试了以下相同的错误。

UPDATE PartHeader
SET PartHeader.manufacturerPartNumber = (SELECT t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID)

我确定我错过了一些简单的东西,但我肯定错过了它。

谢谢你的帮助,丹

4

4 回答 4

6

由于您确定您编写的 SQL 没有问题,我想建议您可能在表上有一个 ON UPDATE/AFTER UPDATE 触发器,该触发器不是为了处理一次更新的多行而编写的。

这可以通过禁用任何与更新相关的触发器并尝试再次运行更新来快速验证。

编辑:

如果您在测试时禁用了触发器,请确保稍后重新启用它。您不能保证更新只会影响一行,因此您需要修复触发器 - 假设您希望触发器的任何进程(也许是审计?)继续。

于 2013-02-15T14:51:48.053 回答
0

我不明白为什么你的结果不起作用。如果您的 Temp 表为每个 PartId 返回多个 DocId,您的第二个查询可能会产生您上面列出的错误。但是,您的第一个查询应该可以工作。

看到这个小提琴:http ://sqlfiddle.com/#!3/9d34b/1

SQL Server 只会跳过重复的记录并进行相应的更新。

于 2013-02-15T14:23:00.230 回答
0

您在下面使用的查询返回不止一行。

SELECT t.partID,t.DocID,ph.partID,ph.manufacturerPartNumber
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

所以当你尝试这样做时

UPDATE ph
SET ph.manufacturerPartNumber = t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID

您没有单个 t.DocID,因为#tmp 返回了多行。因此,请确保=更新中的 RHS 仅返回一个值

于 2013-02-15T14:32:10.300 回答
0

如果您确信子查询不包含重复行,请尝试更改:

UPDATE PartHeader
SET PartHeader.manufacturerPartNumber = (SELECT t.DocID
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID)

对此:

UPDATE PartHeader
SET PartHeader.manufacturerPartNumber = (SELECT max(t.DocID)
FROM #tmp t
INNER JOIN PartHeader ph ON ph.partID = t.partID)

但是,如果这是我的问题,我会更多地查询我的临时表,而不是简单地假设我比软件更聪明。

于 2013-02-15T14:46:57.103 回答