使用来自不同数据库的新表数据更新旧表数据

Posted

技术标签:

【中文标题】使用来自不同数据库的新表数据更新旧表数据【英文标题】:Update old table data with new table data from different database 【发布时间】:2019-12-13 06:28:24 【问题描述】:

在这个问题中,我将为您创建一个示例,以便您了解我的问题。

例如,我有 2 个名为 db1db2 的数据库。两个数据库都有 1 个名为 Stocks 的表,因为它位于旧数据库和新数据库之间。

db1 的库存表

StockCode | StockName |
   123    |   ChairA  |
   456    |   ChairB  |
   789    |   DeskA   |
   012    |   DeskB   |

db2 的库存表

StockCode | StockName |
   abc    |   ChairAC |
   def    |   ChairBD |
   ghi    |   DeskAC  |
   jkl    |   DeskBD  |

我在下面尝试过这段代码,但它重复了股票名称。我认为当我尝试将两个表连接在一起并且 db2 中的一些新股票在 db1 中不存在时会发生这种情况。所以为了匹配行数,它会复制数据。

这是代码

SELECT 
   oldstock.StockCode as oldCode, 
   oldstock.StockName as oldName,
   newstock.StockCode as newCode, 
   newstock.StockName as newName
FROM [db1].[dbo].[Stocks] AS oldstock
INNER JOIN [db2].[dbo].[Stocks] AS newstock
ON oldstock.StockName LIKE '%'+newstock.StockName+'%'
ORDER BY StockCode ASC

这是原始输出:

供您参考,旧数据库有 16389 个项目,新数据库有 16550 个项目,这意味着新数据库插入了新库存项目。

所以问题是如果 db2 中仅包含 db1 股票名称,如何使用 db2 股票表数据更新 db1强>股票名称?

如果 db1 股票中不存在 db2 股票,则不要将数据插入到 db1 股票表中。

这是供您尝试的示例 SQL Fiddle

【问题讨论】:

您的实际问题是什么?重复数据? 【参考方案1】:

使用Join

UPDATE db1
SET db1.oldCode = db2.newCode,    db1.oldName = db2.newName
FROM [db1].[dbo].[Stocks] AS db1 JOIN [db2].[dbo].[Stocks] AS db2
        ON db1.StockName LIKE '%' + db2.StockName + '%'

【讨论】:

如果库存不存在,加入两个数据库将有旧数据库和新数据库的重复行 @Richmond 它基于您的ON 条件。您可以指定 db1.StockName LIKE db2.StockName + '%' sqlfiddle.com/#!18/b8ea1/1 转到此链接以试用示例。【参考方案2】:

您可以尝试将当前的内部连接选择查询放入 CTE,然后更新该 CTE:

WITH cte AS (
    SELECT 
        oldstock.StockCode as oldCode, 
        oldstock.StockName as oldName,
        newstock.StockCode as newCode, 
        newstock.StockName as newName
    FROM [db1].[dbo].[Stocks] AS oldstock
    INNER JOIN [db2].[dbo].[Stocks] AS newstock
        ON oldstock.StockName LIKE '%' + newstock.StockName + '%' AND
           oldstock.StockName <> newstock.StockName
)

UPDATE cte
SET
    oldCode = newCode,
    oldName = newName;

【讨论】:

我收到错误消息“无法在具有唯一索引 'IX_Stocks_StockCode' 的对象 'dbo.Stocks' 中插入重复的键行。重复的键值为 (0488)”。发生这种情况是因为某些股票名称具有相似的名称。 @Richmond 在连接中添加另一个条件,断言两个股票名称不完全相同。 我仍然收到同样的错误信息。在我的表中,一些股票代码和股票名称具有相同的值,其中一些已在我的新数据库中进行了编辑。 那么您可能在这里遇到了逻辑/业务问题。如果新名称/代码可能已经存在于目标列中,那么您将收到此错误。我无法提供解决方法,因为我不知道您的数据。 是否可以在不加入新数据库的情况下更新旧数据库?因为旧的数据库库存项目的行数可能比新的数据库库存项目少。这会影响连接功能吗?

以上是关于使用来自不同数据库的新表数据更新旧表数据的主要内容,如果未能解决你的问题,请参考以下文章

DataTables - 从旧表中删除数据并初始化一个新表

ms sql一些技巧

怎么快速复制千万级的Mysql数据库表

MySQL优化:其他注意事项

如何使用填充旧表中的行的动态数据动态更新新MySQL表中的行?

MySQL复制一张表数据到另一张新表