0

您好,来自 SQL 的绝对初学者!

我有一个要根据另一个表填充的字段。为此,我编写了此查询,但失败:Msg 512, Level 16, State 1, Line 1 子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。该语句已终止。

好的,这里是:

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)

我想要做的是更改 CustomerOrderLineCopy 中的 DepNo,并使用 CustomerOrderCopy 中的 DepNo 中的值 - 基于两个表中的相同 OrderCopyNo。

我愿意接受所有建议。

谢谢, ohhalvors

4

3 回答 3

0

如果您只是将表连接在一起,更新会更容易:

UPDATE A SET A.DepNo = B.DepNo
FROM kre.CustomerOrderLineCopy A
INNER JOIN kre.CustomerOrderCopy B ON A.OrderCopyNo = B.OrderCopyNo
于 2013-07-09T13:59:33.630 回答
0

问题是您的子查询中至少有一个返回多个值。想一想:

表人(姓名,年龄)

亚当,11 岁

伊娃,11 岁

斯文 22

    update tablePerson
    set name = (select name from tablePerson where age = 11)
    where name = 'Sven'

这相当于:将 Sven 的名字设置为 AdamEva。这是不可能的。

如果您想使用子查询,请确保您的子查询只能返回一个值或使用以下命令强制一个值:

select top 1 xxx from ...
于 2013-07-09T14:09:01.513 回答
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在子查询中注释掉了)也就是说,您希望尝试将这些子查询与外部表相关联——而不是引入另一个kre.CustomerOrderLineCopy.

如果您仍然收到错误,那么您仍然有多行kre.CustomerOrderCopy具有相同的OrderCopyNo. 如果是这样,您需要向我们(和 SQL Server)提供您要应用的规则,以了解如何选择要使用的行。

切换到FROM ... JOIN@Avitus 的答案中显示的表格的危险在于,如果有多个匹配的行,它将不再报告 - 它只会默默地选择其中一个 - 永远不会说清楚。


现在我再次查看查询,我不确定它WHERE现在是否需要一个子句。我认为这是一样的:

Update kre.CustomerOrderLineCopy 
SET    DepNo = (
   SELECT customerordercopy.DepNo 
   FROM   kre.CustomerOrderCopy
   WHERE  CustomerOrderLineCopy.OrderCopyNo = kre.CustomerOrderCopy.OrderCopyNo) 
于 2013-07-09T14:14:17.197 回答