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的那些)并不重要?
答案 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...
,这样就不会选择任何列(无论如何都不能使用数据)。
我希望这能回答你的问题。如果我错了,请纠正我:)