SQL Server更新它们存在的位置

时间:2011-04-12 18:28:32

标签: sql-server-2008

update [db2].dbo.tblASDF
set deviceID = (select db1.deviceID FROM [database1].[dbo].[device] as db1,[database2].[dbo].[device] as db2 where db1.name = db2.name)
where exists (select * FROM [database1].[dbo].[device] as db1,[database2].[dbo].[device] as db2 where db1.name = db2.name)

问题/声明1:我在“where exists”中选择*并不重要,重要的是我的“where db1.name = db2.name”子句返回满足此条件的行,因为这些行包含唯一键以帮助我的更新操作? IE,无论我选择了一列还是20列都无关紧要。

问题2:我从两个数据库db1和db2中提取。 “exists”是否知道使用db1 / db2中的唯一键来更新db2的tblASDF.deviceID列?即,从“where db1.name = db2.name”返回的有两组唯一键(db1的那些,以及db2的那些)并不重要?

2 个答案:

答案 0 :(得分:2)

Q1正确。 我总是这样做:

if exists (select 1 from attachments WHERE ID<6) ...

对于读者而言,显然无关紧要的是什么。在这种情况下,如果有任何ID小于6的记录,则存在某些内容。

Q2 WHERE Exists子句将解析为零记录或多于零个记录。 在第一种情况下,零记录,UPDATE将什么也不做。因为什么都不存在 在第二种情况下,您可以无任何替换WHERE EXISTS .... 您的查询解析为

update [db2].dbo.tblASDF  
set deviceID =  (select db1.deviceID FROM [database1].[dbo].[device] as db1 
 ,[database2].[dbo].[device] as db2  where db1.name = db2.name)  

内部查询不会返回两组唯一键。它将返回一组db1.deviceID ID,其中每个表中的名称相同。 只有在其tblASDF表中的DB2的DeviceID列包含DB1在db1.tblASDF中的等效表db1.deviceID中存在的ID时,才会进行更新。

它将忽略db2.deviceID列,因此该字段中的ID无关紧要。

必须说复制两个相同的T-SQL片段是不合理的,这使得代码更难阅读。我常常遇到SQL在两段代码之间存在非常非常微妙的差异(例如1而不是2)从而引入了一个错误。

“join”由WHERE db1.name = db2.name子句

执行

答案 1 :(得分:1)

exists仅返回true或false,它与键没有任何关系。想象一下,只要从子查询返回多行,并在返回0行时返回true,它就会返回false

您可以将exists (select * FROM...替换为exists (select 1 FROM...,这样就不会选择任何列(无论如何都不能使用数据)。

我希望这能回答你的问题。如果我错了,请纠正我:)