这两个查询之间有什么区别?

时间:2014-09-23 02:46:39

标签: sql sql-server

当从另一个表更新表或执行涉及比较两个表的查询时,我通常有一个查询的习惯,如下所示

UPDATE dbo.Table1 SET COL =
(
 SELECT i.colid FROM 
    dbo.Table2 i 
      WHERE i.did = dbo.Table1.did and 
         i.[pdate] = dbo.Table1.pdate and
         i.pamount = dbo.Table1.pay and 
         i.[Ref No ] = dbo.Table1.refno and
         i.[cNo ] = dbo.Table1.receipt
)

最近上面的失败让我失望了。它返回一个错误,表示查询返回的数量超过1个记录/行。然而,我的上司询问如下,它的工作原理。我仍然无法弄清楚为什么我的失败和他的成功。为什么以前从未让我失望?

UPDATE dbo.Table1 SET COL = i.colid 
from
 dbo.Table2 i 
   WHERE i.did = dbo.Table1.did and 
         i.[pdate] = dbo.Table1.pdate and
         i.pamount = dbo.Table1.pay and 
         i.[Ref No ] = dbo.Table1.refno and
         i.[cNo ] = dbo.Table1.receipt

1 个答案:

答案 0 :(得分:3)

您的查询失败,因为它返回多行。也就是说,有两行或更多行符合条件。我认为从错误中可以看出这一点。你有一个标量子查询。它应该最多返回一行和一列。

第二个工作,因为允许连接具有多个匹配的行。但是,只能设置其中一个值 - 来自任意匹配行之一。在我看来,让多个匹配的行匹配并选择任意值是不好的形式。但是,它确实有效。