【问题标题】:Insert multiple rows using SQL Merge statement when condition matched条件匹配时使用 SQL Merge 语句插入多行
【发布时间】:2020-01-16 13:36:27
【问题描述】:

具有非身份主键的表。所以每当我们插入新记录时,我们也必须传递主键。

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

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

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);

【问题讨论】:

  • 您的 RDBMS 是什么(MS Sql、Oracle 等)?
  • @DmitryBychenko 这是一个 MS SQL
  • 首先,您在 T2.ID 上合并,但插入 VALUES(T2.ProductID ...,这是一个错字吗?如果不是,那可能是您的问题,这并没有说明 T2。 ProductID 是否已经存在。其次,您确定 T2.ID(或 ProductID)满足主键(唯一,非空)的要求吗?
  • @RobertSheahan 对不起,这是我的错误。它是 T2.ID。是的,如果条件匹配,则匹配的行将得到更新,但对于那些条件不匹配的行,我得到不能插入重复错误。希望我回答了你的问题。如果您需要更多详细信息,请告诉我。

标签: sql sql-server sql-merge


【解决方案1】:

您示例中的代码有效,这是一个易于重现的演示

;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

并查看是否有任何记录出现。如果它们都是空的,请查看您的实际合并代码,看看它与您发布的内容有何不同。如果您发布更新的示例代码,我会尝试看看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 2016-11-29
    • 2021-01-29
    • 2017-05-12
    • 1970-01-01
    相关资源
    最近更新 更多