在这个问题上,我将为您创建一个样本,以便您了解我的问题。
例如,我有两个名为 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
这是原始输出:
供您参考的是,旧数据库有16389个项目,新数据库有16550个项目,这意味着新数据库已插入了新的库存项目。
所以问题是,如果 db2 中仅包含 db1 库存名称,如何用 db2 库存表数据更新 db1 。强>股票名称?
如果 db1 库存中不存在 db2 库存,则不要将数据插入 db1 库存表中。
这是供您尝试的示例 SQL Fiddle
答案 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 + '%'