基于另一个表更新语句

时间:2016-06-02 10:47:53

标签: sql sql-server sql-update

我正在尝试更新表中的列从另一个表获取它并且我有两个表之间的关系,因为父级具有主键“tbl_Inv_ClientItemsReturnOrders”并且子级具有外键“tbl_Inv_ClientItemsReturnOrderDetails”。

我试试这个

update U
set U.InventoryReturnReasonID =
        (select InventoryReturnReasonID
         from tbl_Inv_ClientItemsReturnOrders
         where ClientItemsReturnOrderID = U.ClientItemsReturnOrderID)
from [dbo].[tbl_Inv_ClientItemsReturnOrderDetails] U

但是我收到了这个错误

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   声明已经终止。

我希望通过表“tbl_Inv_ClientItemsReturnOrders”中的“InventoryReturnReasonID”列更新表“tbl_Inv_ClientItemsReturnOrderDetails”中的“InventoryReturnReasonID”列

2 个答案:

答案 0 :(得分:1)

您可以使用下面给出的查询来更好地了解问题。

 SELECT * FROM [dbo].[tbl_Inv_ClientItemsReturnOrderDetails] U
 INNER JOIN [dbo].[tbl_Inv_ClientItemsReturnOrders] P ON (P.ClientItemsReturnOrderID = U.ClientItemsReturnOrderID)

我们可以选择使用join编译更新。查询如下

 UPDATE U
 SET U.InventoryReturnReasonID = P.InventoryReturnReasonID
 FROM [dbo].[tbl_Inv_ClientItemsReturnOrderDetails] U
 INNER JOIN [dbo].[tbl_Inv_ClientItemsReturnOrders] P ON (P.ClientItemsReturnOrderID = U.ClientItemsReturnOrderID)

答案 1 :(得分:0)

错误很清楚。您可以使用TOP 1选择任意值:

Update U
  set U.InventoryReturnReasonID = (select TOP 1 ro.InventoryReturnReasonID
                                   from tbl_Inv_ClientItemsReturnOrders ro
                                   where ro.ClientItemsReturnOrderID = U.ClientItemsReturnOrderID
                                  )
  from [dbo].tbl_Inv_ClientItemsReturnOrderDetails U;

通常情况下,TOP应该有ORDRER BY。您可以添加ORDER BY来指定更新应使用的多个值中的哪一个。

注意:使用合格的列名(即包括表别名)总是一个好主意。对于相关子查询,它应该是强制性的,因为如果出现问题可能存在危险。例如,如果列ro.ClientItemsReturnOrderID不存在,则查询将返回太多行。

另一种方法是使用聚合:

Update U
  set U.InventoryReturnReasonID = (select max(ro.InventoryReturnReasonID)
                                   from tbl_Inv_ClientItemsReturnOrders ro
                                   where ro.ClientItemsReturnOrderID = U.ClientItemsReturnOrderID
                                  )
  from [dbo].tbl_Inv_ClientItemsReturnOrderDetails U;