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)
但这不起作用——知道如何实现这一目标吗?
你不能说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)
| 归档时间: |
|
| 查看次数: |
4428 次 |
| 最近记录: |