我知道这看起来像是重复的,但我一直在处理类似的问题,但我仍然无法解决这个错误。
我无法理解为什么这个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)
我确定我错过了一些简单的东西,但我肯定会错过它。
感谢您的帮助, 丹
答案 0 :(得分:6)
由于您确定您编写的SQL很好,我想建议您可能在表上有一个ON UPDATE / AFTER UPDATE触发器,该触发器未写入以处理多行正在更新马上。
可以通过禁用任何与更新相关的触发器并尝试再次运行更新来快速验证。
编辑:
如果您在测试时禁用了触发器,请确保稍后重新启用它。您不能保证更新只会影响一行,因此您需要修复触发器 - 假设您想要触发器的任何进程(可能是审计?)继续。
答案 1 :(得分:0)
我不明白为什么你的结果不起作用。如果Temp表每个PartId返回多个DocId,那么您的第二个查询可能会产生您在上面列出的错误。但是,您的第一个查询应该有效。
请参阅此小提琴:http://sqlfiddle.com/#!3/9d34b/1
SQL Server将跳过重复的记录并相应地更新。
答案 2 :(得分: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返回了多行。因此,请确保更新中=
的R.H.S只返回一个值
答案 3 :(得分: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)
然而,如果这是我的问题,我会更多地查询我的临时表,而不是简单地假设我比软件更聪明。