条件匹配时使用SQL Merge语句插入多行
具有非标识主键的表。所以,每当我们插入新记录时,我们也必须传递主键 当记录不匹配时,我必须使用Merge语句插入上表。但问题是我不能为每次插入增加主键。不能在主键列中插入重复项。 请在下面找到合并查询示例 是否可以通过增量主键插入多行条件匹配时使用SQL Merge语句插入多行,sql,sql-server,sql-merge,Sql,Sql Server,Sql Merge,具有非标识主键的表。所以,每当我们插入新记录时,我们也必须传递主键 当记录不匹配时,我必须使用Merge语句插入上表。但问题是我不能为每次插入增加主键。不能在主键列中插入重复项。 请在下面找到合并查询示例 是否可以通过增量主键插入多行 MERGE DBO.Table1 T1 USING (DBO.Table2 )T2 ON (T1.ID = T2.ID) WHEN MATCHED THEN UPDATE SET
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);
示例中的代码很有效,下面是一个易于复制的演示
;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插入
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中检查您的数据
SELECT ID, COUNT(ID) as IDCount FROM DBO.Table2 GROUP BY ID HAVING COUNT(*) > 1
SELECT * FROM DBO.Table2 WHERE ID IS NULL
看看有没有记录。如果这两个都是空的,请查看实际的合并代码,看看它与您发布的代码有何不同。如果您发布更新的示例代码,我将尝试查看。您的RDBMS(MS Sql、Oracle等)是什么?@DmitryBychenko它是MS SQLFirst,您在T2.ID上合并,但插入值(T2.ProductID…,这是一个输入错误吗?如果不是,这可能是您的问题,这并没有说明T2.ProductID是否已经存在。其次,您确定T2.ID吗(或ProductID)满足主键(唯一、非空)的要求?@RobertSheahan抱歉,这是我的错误。它是T2.ID。是的,如果条件匹配,则匹配的行将被更新,但对于那些条件不匹配的行,我将无法插入重复错误。希望我回答了您的查询。如果您需要更多详细信息,请让我知道。