首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件匹配时使用SQL Merge语句插入多行

条件匹配时使用SQL Merge语句插入多行
EN

Stack Overflow用户
提问于 2020-01-16 21:36:28
回答 1查看 270关注 0票数 0

具有非标识主键的表。因此,每当我们插入新记录时,我们也必须传递主键。

当使用Merge语句不匹配记录时,我必须插入到上面的表中。但问题是我不能为每个插入增加主键。它不能在主键列中插入重复。请在下面找到合并查询示例。

是否可以通过增加主键来插入多行。

代码语言:javascript
复制
MERGE DBO.Table1 T1
        USING (DBO.Table2 )T2
        ON (T1.ID = T2.ID)
        WHEN MATCHED
            THEN UPDATE SET 
            T1.CURVE = T2.CURVE
        WHEN NOT MATCHED
            THEN INSERT (ID, CURVE )
            Values ( T2.ID, T2.CURVE);
EN

回答 1

Stack Overflow用户

发布于 2020-01-16 23:25:14

示例中的代码可以正常工作,下面是一个易于重现的演示

代码语言:javascript
复制
;with cteT as ( SELECT * FROM (VALUES (1,'T1 Val 1') , (2,'T1 Val 2') , (4,'T1 Val 4') ) as T1(ID, Curve)
)SELECT * INTO #Dest FROM cteT

;with cteT as ( SELECT * FROM (VALUES (3,'T2 Val 3') , (4,'T2 Val 4') , (5,'T2 Val 5') ) as T1(ID, Curve)
)SELECT * INTO #Srce FROM cteT;

MERGE INTO #Dest as T1
USING #Srce as T2 ON T1.ID=T2.ID
    WHEN MATCHED THEN UPDATE SET T1.Curve=T2.CURVE
    WHEN NOT MATCHED BY TARGET 
        THEN INSERT (ID, Curve) VALUES(T2.ID, T2.Curve)
;

SELECT * FROM #Dest ORDER BY ID

DROP TABLE #Dest
DROP TABLE #Srce

这是输出,请注意,对于1和2,值是不变的;对于4,它是从T2更新的;对于3和5,它是从T2插入的。

代码语言:javascript
复制
ID  Curve
1   T1 Val 1
2   T1 Val 2
3   T2 Val 3
4   T2 Val 4
5   T2 Val 5

这意味着问题很可能出在T2.ID的值中,或者样本太过精简而遗漏了实际代码中的一个复杂问题。我会从检查T2.ID中的数据开始

代码语言:javascript
复制
SELECT ID, COUNT(ID) as IDCount FROM DBO.Table2 GROUP BY ID HAVING COUNT(*) > 1
SELECT * FROM DBO.Table2 WHERE ID IS NULL

看看有没有什么记录。如果这两个都是空的,请查看您的实际合并代码,看看它与您发布的代码有何不同。如果你更新了示例代码,我会试着去看看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59770856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档