SQL Server中如何将一个表的数据合并到另一个表

Mar*_*009 1 t-sql sql-server merge ssms sql-server-2012

我有这样的表:

表A:

customerId     mobNo1    mobNo2    mobNo3
-----------------------------------------
123            999       997       987
124            888       666       555
Run Code Online (Sandbox Code Playgroud)

表B:

customerId     mobNumbers    
-------------------------
123            999       
123            997       
123            987       
124            888       
124            666       
124            555
Run Code Online (Sandbox Code Playgroud)

我需要编写一条MERGE语句,以便将表 A 中的数据更新或插入到表 B 中

这是我尝试过的:

MERGE tableB tgt
USING (SELECT * FROM tableA) src ON src.customerId = tgt.customerId

WHEN MATCHED THEN
    UPDATE 
        SET mobNumbers = src.mobNo1,
            mobNumbers = src.mobNo2,
            mobNumbers = src.mobNo3,
 
WHEN NOT MATCHED THEN 
    INSERT (customerID, mobileNumbers)
    VALUES (src.customerID, src.mobNo1),
           (src.customerID, src.mobNo2), 
           (src.customerID, src.mobNo3);
END
Run Code Online (Sandbox Code Playgroud)

但这不起作用——知道如何实现这一目标吗?

Aar*_*and 5

你不能说SET col = something, col = something else你是否使用MERGE- 每个SET指令只适用于一行,因此多次提及同一列并期望以不同方式影响多行并不是它的工作原理。

恕我直言,根本不涉及最简单的方法MERGE(不仅仅是因为我长期以来对它的偏见有几个人同意);只需删除匹配的客户,然后为每个客户插入新的集合。这没有错误处理,但恕我直言,这是最干净的路径:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;

-- just wipe out all existing rows for matching customers
DELETE b FROM dbo.tableB AS b
  INNER JOIN dbo.tableA AS a
  ON a.customerId = b.customerId;

-- re-populate the whole set for each matching customer
INSERT dbo.tableB(customerId, mobNumbers)
  SELECT customerId, mobNumbers
  FROM dbo.tableA AS a
  UNPIVOT (mobNumbers FOR mobs IN ([mobNo1],[mobNo2],[mobNo3])) AS u
  WHERE NOT EXISTS (SELECT 1 FROM dbo.tableB WHERE customerId = a.customerId);

COMMIT TRANSACTION;
Run Code Online (Sandbox Code Playgroud)