2014-09-23 114 views
0

当更新从另一个表或查询执行涉及比较两个表,我通常有查询像下面这两个查询有什么区别?

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

如果''where'标准的'Table2'中没有重复数据,那么您的原始查询不会失败。但是,一旦'Table2'匹配多行,就会收到错误信息。您可以通过在子查询中使用'SELECT TOP 1'来使原始查询工作。我认为'JOIN'比'相关子查询'更可取。 – sgeddes 2014-09-23 02:55:52

+0

谢谢先生。令我困惑的是,他也肯定会返回一个副本。那他为什么通过? – 2014-09-23 02:59:28

回答

3

您的查询失败,因为它返回多于一行。也就是说,有两行或多行符合条件。我认为这个错误很明显。你有一个标量子查询。它应该返回最多一行一列。

第二个工作,因为连接允许有多个行匹配。但是,只有一个值被设置 - 从任意一个匹配行中设置。在我看来,使多个匹配行匹配并选择一个任意值是很糟糕的形式。但是,它确实有效。

+0

当你说允许有多行匹配时,你是指他返回多于一个匹配的行吗? – 2014-09-23 02:55:05

+0

相关:http://msdn.microsoft.com/en-AU/library/ms177523.aspx * UPDATE语句的结果是未定义的,如果该语句包含一个未指定的FROM子句,那么只有一个值可用于更新的每个列事件,也就是说UPDATE语句不是确定性的。例如,在以下脚本的UPDATE语句中,Table1中的两行都符合UPDATE语句中FROM子句的限定条件;但未定义来自Table1的哪一行用于更新Table2中的行。* – 2014-09-23 02:55:46

+0

@NuruSalihu。 。 。匹配逻辑在两个查询中是相同的。首先,上下文表示只允许一行,这样数据库就会返回一个错误。对于第二行,允许多行,但只有一行被任意选择用于更新。 – 2014-09-23 03:01:20