【问题标题】:comparing rows of two tables in sqlserver比较sql server中两个表的行
【发布时间】:2013-06-06 15:36:27
【问题描述】:

谁能为我提供以下问题的代码:

我在 sql server 中有两个表。两个表具有相同数量的字段和字段名称。如果我将这两个表视为 ActualData 和 TempData,我需要使用“databaseID”列将 ActualData 表中的数据更新为 TempData 中的数据,例如,如果遵循 TempData 表

DatabaseID | FirstName |  MiddleName    
277459 | VALINDA | CLAY         
283934 | LAURA | MARIE          
2.7E+13 | Jamie | Hawley

我需要在 ActualData 表中找到与 TempData 中的行具有相同 databaseID 的行,并将整个记录替换为 TempData 表中的记录。并且,如果我们在 ActualData 中找不到记录,然后我们需要将该记录从 TempData 添加到 ActualData。这需要对 TempData 中的所有记录进行。 我该怎么做?

【问题讨论】:

标签: sql sql-server stored-procedures cursor


【解决方案1】:

试试这个:

 update ad
 set FirstName = td.FirstName,
     Middlename = td.MiddleName
 from ActualData ad
 inner join TempData td
 on ad.DatabaseID = td.DatabaseId
 where ad.FirstName != td.FirstName or ad.MiddleName != td.MiddleName

 insert into ActualData (DatabaseId, FirstName, MiddleName)
 select td.DatabaseId, td.FirstName, td.MiddleName
 from TempData td 
 left outer join ActualData ad on td.DatabaseId = ad.DatabaseId
 where ad.DatabaseId is null

【讨论】:

  • 我们如何对 TempData 中的所有记录进行处理? tempdata 表中有大约 10k 条记录。
  • 这将对 TempData 中具有与不同数据匹配的 DatabseID 的每条记录,以及在 ActualData 中没有匹配记录的 TempData 中的每条记录执行此操作。试试看吧。
  • 谢谢 wagregg。但在示例表中,我只有 3 个字段,而在原始表中,有 100 多个字段。那么,我们如何设置所有字段的值呢?
  • 您需要将每个字段添加到更新子句,如果需要,将每个字段添加到 where 子句。或者,您可以从实际中删除 Temp 中存在的所有记录,然后从 temp 中重新插入所有记录。
  • 在看到您对 110 个字段的评论后,我在答案中添加了 DELETE。
【解决方案2】:
Update a Set
     FirstName = t.FirstName,
     LastName = t.LastName,
     etc.
From ActualData a
    Join TempData t
        On t.DatabaseId = a.DatabaseId
-- -----------------------------------
Insert ActualData(DatabaseId, 
    FirstName, LastName,
    etc. ...)
Select DatabaseId, 
    FirstName, LastName,
    etc.
From tempData t
Where Not exists
    (Select * From ActualData
     DatabaseId = t.DatabaseId)

【讨论】:

    【解决方案3】:

    使用类似这样的更新/插入命令(与 sql 2000 及更高版本兼容)

    Update ActualData
    Set FirstName = TempData.FirstName,
    MiddleName = TempData.MiddleName
    FROM ActualData
    INNER JOIN TempData ON ActualData.DatabaseId = TempData.DatabaseId
    
    insert into ActualData(DatabaseId, FirstName, MiddleName)
    SELECT TempData.DatabaseId, TempData.FirstName, TempData.MiddleName
    FROM TempData
    LEFT OUTER JOIN ActualData ON ActualData.DatabaseId = TempData.DatabaseId
    WHERE ActualData.DatabaseId IS NULL
    

    或者你可以使用合并命令

    【讨论】:

    • 感谢 saamorim。如果我有大约 110 个字段,如何设置值?
    • 如果你希望它是动态的,那么你应该创建一个基于syscolumns的动态sql语句。要查询 syscolumns,请从 sys.columns 中选择名称,其中 id = object_id('ActualData')。由于我不喜欢动态 sql,通常我会在 sys.columns 中查询列名并将其粘贴到 excel 中并应用公式 =A1 & ", = TempData"。 & A1 将为您提供所有 100 列的更新正文。希望我有所帮助
    【解决方案4】:

    听起来你只想要一个带有 JOIN 的 UPDATE:

    UPDATE A
    SET
        A.FirstName = B.FirstName 
       ,A.MiddleName = B.Middlename
    FROM
        ActualData A
        JOIN
        TempData B ON A.databaseID = B.databaseID
    

    还有一个插入:

    INSERT INTO ActualData 
    SELECT *
    FROM TempData 
    WHERE databaseID  NOT IN (SELECT DISTINCT databaseID  FROM ActualData)
    

    鉴于您有 110 个字段,您可能需要先删除然后插入,因为您可以在不列出列的情况下同时执行这两项操作:

    DELETE FROM ActualData 
    WHERE databaseID  IN (SELECT DISTINCT databaseID FROM ActualData)
    

    然后在 DELETE 之后执行上面的 INSERT。不知道是否有办法在不列出列的情况下使用 JOIN 进行更新。

    【讨论】:

    • 如果记录不存在,OP 还要求插入。
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多