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

时间:2019-12-13 06:28:24

标签: sql sql-server

在这个问题上,我将为您创建一个样本,以便您了解我的问题。

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

db1的库存表

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

db2的库存表

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

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

这是代码

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

这是原始输出:

sql query output

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

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

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

这是供您尝试的示例 SQL Fiddle

2 个答案:

答案 0 :(得分:1)

您可以尝试将当前的内部联接选择查询放入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;

答案 1 :(得分: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 + '%'