使用另一个表中的数据更新表列

时间:2017-02-02 10:29:02

标签: sql-server database sql-update

我到处搜索但是我似乎无法使其工作或理解为什么联接表现得像这样,现在我无法问任何人,所以只是在这里试试我的运气。所以这就是问题所在:

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 中需要更新的行。任何输入将不胜感激。

3 个答案:

答案 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')