又一个子查询问题

时间:2013-07-09 13:53:23

标签: sql-server subquery

来自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

3 个答案:

答案 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