微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server更新它们所在的记录

如何解决SQL Server更新它们所在的记录

|
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 where”中选择*并不重要,重要的是我的“ where db1.name = db2.name \”子句返回的是满足此条件的行,因为这些行包含唯一键以帮助我进行更新? IE,无论是选择一列还是20列都是无关紧要的。 问题2:我正在从db1和db2两个数据库提取数据。 “存在”是否知道使用db1 / db2中的唯一键来更新db2的tblASDF.deviceid列?即,从\“其中db1.name = db2.name \”返回的2组唯一键(db1的键和db2的键)没关系吗?     

解决方法

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.tblASDF中DB1的等效表db1.deviceID中存在的ID的情况下,才进行更新。 它将忽略db2.deviceID列,因此该字段中的ID不相关。 必须说,复制两个相同的T-SQL是不必要的,这会使代码更难阅读。我经常碰到SQL,两段代码之间有非常非常细微的差异(例如1而不是2),从而引入了错误。 WHERE db1.name = db2.name子句正在执行\“ join \”     ,
exists
仅返回true或false,与键无关。想象一下,就像它从子查询返回多行时返回
true
,而在返回0行时返回
false
。 您可以将
exists (select * FROM...
替换为
exists (select 1 FROM...
,以便不选择任何列(无论如何也不能使用数据)。 我希望这回答了你的问题。如果我错了,请指正我:)     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。