来自SQL的绝对初学者的问候!
我有一个我希望根据另一个表填充的字段。为此,我写了这个查询,它失败了:Msg 512,Level 16,State 1,Line 1 子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。 声明已经终止。
oK,这里是:
Update kre.CustomerOrderLineCopy
SET DepNo = (SELECT customerordercopy.DepNo
FROM kre.CustomerOrderCopy , kre.CustomerOrderLineCopy
WHERE CustomerOrderLineCopy.OrderCopyNo =kre.CustomerOrderCopy.OrderCopyNo)
WHERE CustomerOrderLineCopy.OrderCopyNo = (SELECT CustomerOrderCopy.OrderCopyNo
FROM kre.CustomerOrderCopy, kre.CustomerOrderLineCopy
WHERE kre.CustomerOrderLineCopy.OrderCopyNo = kre.CustomerOrderCopy.OrderCopyNo)
我要做的是在CustomerOrderCine中更改DepNo,并在CustomerOrderCopy中使用DepNo中的值 - 基于两个表中的相同OrderCopyNo。
我愿意接受所有建议。
谢谢, ohalvors
答案 0 :(得分:0)
如果您只是将表连在一起,则更新更容易:
UPDATE A SET A.DepNo = B.DepNo
FROM kre.CustomerOrderLineCopy A
INNER JOIN kre.CustomerOrderCopy B ON A.OrderCopyNo = B.OrderCopyNo
答案 1 :(得分:0)
问题是至少有一个子查询返回多个值。想一想:
tablePerson(姓名,年龄)
Adam,11
伊娃,11岁Sven 22
update tablePerson
set name = (select name from tablePerson where age = 11)
where name = 'Sven'
这相当于:将Sven的名字设为Adam 和 Eva。这是不可能的。
如果您想使用子查询,请确保您的子查询只能返回一个值或通过使用强制一个值:
select top 1 xxx from ...
答案 2 :(得分:0)
这可能足以使其安静下来:
Update kre.CustomerOrderLineCopy
SET DepNo = (SELECT customerordercopy.DepNo
FROM kre.CustomerOrderCopy --, kre.CustomerOrderLineCopy
WHERE CustomerOrderLineCopy.OrderCopyNo =kre.CustomerOrderCopy.OrderCopyNo)
WHERE CustomerOrderLineCopy.OrderCopyNo = (SELECT CustomerOrderCopy.OrderCopyNo
FROM kre.CustomerOrderCopy --, kre.CustomerOrderLineCopy
WHERE kre.CustomerOrderLineCopy.OrderCopyNo = kre.CustomerOrderCopy.OrderCopyNo)
(我已在子查询中注释掉kre.CustomerOrderLineCopy
)也就是说,您希望希望尝试将这些子查询与外表关联起来 - 不要引入另一个{{1}实例}}
如果仍然出现错误,那么kre.CustomerOrderLineCopy
中的多行仍然具有相同的kre.CustomerOrderCopy
。如果是这样,您需要向我们(和SQL Server)提供您想要应用的规则,以便选择要使用的行。
切换到@ Avitus答案中显示的OrderCopyNo
形式的危险在于它将不再报告是否存在多个匹配的行 - 它将只是默默地选择其中一个 - 哪一个从未明确。
现在我再次查看查询,我不确定它现在是否需要FROM ... JOIN
子句。我认为这是一样的:
WHERE