在重复键[T-SQL]上跳过插入(并继续)

时间:2018-01-15 13:20:14

标签: sql-server tsql

我正在努力为一个可以说是非常简单的任务找到一个可行的解决方案:

我有一个简单的查询:

INSERT INTO [INTRANET].[dbo].[SOME_STATUS]
   ([AUS_STATUS_VID]
  ,[AUS_STATUS_STATUS]
  ,[AUS_STATUS_JAHR]
  ,[AUS_STAUTS_END]
 )

SELECT DISTINCT CD_CLVID, '1', '2017', '0'
FROM [SNTRANET].[dbo].[SOME_DETAILS]
WHERE CD_JAHR = 2017     

长话短说:用另一张桌子的结果填写一张桌子。现在看来,我给出了不一致的数据。我试图找到一个类似于replace intoon duplicate key update的解决方案(我曾经使用过MySQL)。但是,T-SQL似乎没有这个。

是否有一个简单的解决方案,只是跳过重写键并继续结果集的其余部分?

我正在使用SQLServer 2008 R2

修改1

根据要求,出现错误消息:

  

违反PRIMARY KEY约束'PK_T_KB_AUSZAHLUNG_STATUS'。无法在对象'dbo.T_KB_AUSZAHLUNG_STATUS'中插入重复键。重复键值为(7463)。

4 个答案:

答案 0 :(得分:1)

您可以使用SQL Server Merge Join功能。如果未找到匹配项,它将插入新行或Else更新匹配项的现有记录

示例:

MERGE BookInventory bi
USING BookOrder bo
ON bi.TitleID = bo.TitleID
WHEN MATCHED THEN
  UPDATE
  SET bi.Quantity = bi.Quantity + bo.Quantity
WHEN NOT MATCHED BY TARGET THEN
  INSERT (TitleID, Title, Quantity)
  VALUES (bo.TitleID, bo.Title,bo.Quantity);

如果在BookOrder .TitleId的BookInventory表中找到匹配,则插入记录,否则匹配记录将被更新。

您也可以使用多个语句实现相同的目标。喜欢这个

IF EXISTS(SELECT 1 FROM YourTable WHERE <Condition>
BEGIN
    <Update Statements>
END
ELSE
BEGIN
     <Insert Statement>
END

或者在直接插入中,只需检查是否存在以跳过目标表中已有的记录

INSERT INTO TargetTable
SELECT * FROM SourceTable ST
WHERE NOT EXISTS
(
    SELECT 1 FROM TargetTable WHERE TargetId = ST.TargetId 
)

答案 1 :(得分:1)

如果重复键是[AUS_STATUS_VID]列,那么尝试在表上使用别名而不是EXISTS

INSERT INTO [INTRANET].[dbo].[SOME_STATUS]
   ([AUS_STATUS_VID]
  ,[AUS_STATUS_STATUS]
  ,[AUS_STATUS_JAHR]
  ,[AUS_STAUTS_END]
 )
SELECT DISTINCT S.CD_CLVID, '1', '2017', '0'
FROM [SNTRANET].[dbo].[SOME_DETAILS] S
WHERE S.CD_JAHR = 2017
AND NOT EXISTS
(
  SELECT SS.AUS_STATUS_VID FROM [INTRANET].[dbo].[SOME_STATUS] SS
  WHERE SS.AUS_STATUS_VID = S.CD_CLVID
) ;

答案 2 :(得分:0)

使用ROW_NUMBER()确保传入结果没有重复,然后使用WHERE子句确保它不存在于目标表中

SELECT col1, col2, col3, ...
FROM
(
    SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY PK_COL ORDER BY some_col)
    FROM   SOME_TABLE
) d
WHERE d.RN = 1
AND   NOT EXISTS
      (
           SELECT *
           FROM   DEST_TABLE x
           WHERE  x.PK_COL = d.PK_COL 
      )

答案 3 :(得分:0)

INSERT INTO [INTRANET].[dbo].[SOME_STATUS]
   ( [AUS_STATUS_VID]
    ,[AUS_STATUS_STATUS]
    ,[AUS_STATUS_JAHR]
    ,[AUS_STAUTS_END]
   )

SELECT DISTINCT D.CD_CLVID, '1', '2017', '0'
FROM [SNTRANET].[dbo].[SOME_DETAILS] D
LEFT JOIN [INTRANET].[dbo].[SOME_STATUS] S 
ON S.CD_CLVID = D.CD_CLVID 
WHERE D.CD_JAHR = 2017   
AND S.CD_CLVID is null

如果CD_CLVID是[SNTRANET]中的PK。[dbo]。[SOME_DETAILS]则您不需要明确的