我到处搜索但是我似乎无法使其工作或理解为什么联接表现得像这样,现在我无法问任何人,所以只是在这里试试我的运气。所以这就是问题所在:
tblOldAccess
User Srv Perm LogDtTm
------------------------------------------------
TestNm1 Srv1 Perm1 2016-09-20 00:00:00.000
TestNm1 Srv2 Perm2 2016-05-30 00:00:00.000
TestNm1 Srv1 Perm3 2016-05-30 00:00:00.000
tblNewAccess
User Srv Perm LogDtTm
------------------------------------------------
TestNm1 Srv1 Perm1 2016-11-20 00:00:00.000
TestNm1 Srv2 Perm2 2016-12-30 00:00:00.000
TestNm1 Srv1 Perm4 2017-02-01 21:50:32.197
如果两个表之间有相同的User,Srv和Perm,我想用 tblNewAccess 中的当前LogDtTm更新 tblOldAccess tabke,就像这样
期望的结果 - 的 tblOldAccess
User Srv Perm LogDtTm
------------------------------------------------
TestNm1 Srv1 Perm1 2016-11-20 00:00:00.000
TestNm1 Srv2 Perm2 2016-12-30 00:00:00.000
TestNm1 Srv1 Perm3 2016-05-30 00:00:00.000
我能够获得User,Srv,Perm具有相同信息的行 通过 INTERSECT 命令但是我无法正确加入它们以便得到类似的内容:
UPDATE [tblOldAccess]
SET [LogDtTm] = [tmp].[LogDtTm]
FROM tblOldAccessas tmp
JOIN (
SELECT [user], Srv, [Perm] from [tblNewAccess]
INTERSECT
SELECT [user], Srv, [Perm] from [tblOldAccess]
) as drv
ON tmp.[User] = drv.[User]
WHERE tmp.[User] = drv.[User]
AND tmp.[Srv] = drv.[Srv]
我尝试了多个连接条件甚至多个where条件,只更新那些对应于 tblOldAccess 表中LogDtTm 列中需要更新的行。任何输入将不胜感激。
答案 0 :(得分:0)
试试这个:
UPDATE old
SET old.[LogDtTm] = new.[LogDtTm]
FROM tblOldAccess old
INNER JOIN tblNewAccess new ON old.[User] = new.[User] AND
old.[Srv] = new.[Srv] AND
old.[Perm] = new.[Perm]
注意:首先备份数据
答案 1 :(得分:0)
检查排序规则级别,因为您要加入字符串数据类型。可能这会帮助你。
答案 2 :(得分:0)
感谢所有帮助过的人!我终于设法追踪这个问题了,令人遗憾的是(令人沮丧的是)它在整个表中的某些行中只是一个空值,这阻止了JOIN正常运行。这是一些documentation。
我使用COALESCE
创建了一个相关的工作,它现在完美无缺!感谢大家!如果有人想知道这是我目前的语法:
UPDATE old
SET old.[LogDtTm] = new.[LogDtTm]
FROM [tblOldAccess] as old
INNER JOIN [tbNewAccess] new
ON COALESCE(old.[User],'noValue') = COALESCE(new.[User],'noValue')
AND COALESCE(old.[Srv],'noValue') = COALESCE(new.[Srv],'noValue')
AND COALESCE(old.[Perm],'noValue') = COALESCE(new.[Perm],'noValue')