2012-08-16 76 views
2

我想从一个表插入一些数据到另一个,但我想阻止插入重复的行。我目前以下查询:防止使用SQL Server 2008插入重复行

INSERT INTO Table1 
(
    Table1Col1, 
    Table1Col2, 
    Table1Col3, 
    Table1Col4, 
    Table1Col5 
) 
SELECT 
    Table2Col1, 
    Table2Col2 = constant1, 
    Table2Col3 = constant2, 
    Table2Col4 = constant3, 
    Table2Col5 = constant4 
FROM Table2 
WHERE 
    Condition1 = constant5 
AND 
    Condition2 = constant6 
AND 
    Condition3 = constant7 
AND 
    Condition4 LIKE '%constant8%' 

什么我不知道的是,我试图从表2插入到表1的行可能已经存在,我想,以防止发生这种可能的重复和跳过插入然后转到插入下一个唯一的行。

我已经看到我可以使用WHERE NOT EXISTS子句和INTERSECT关键字的使用,但我没有完全理解如何将它应用于我的特定查询,因为我只想使用Table2中的一些选定数据,然后将一些常量值插入到Table1中。

编辑:

我要补充一点TableCol2通过对TableCol5实际上并不存在于结果集中的列,我只是填充这些列一起Table2Col1返回的。

+1

您可以在您的列上定义一个应该是唯一的'UNIQUE'约束 - 那么没有“重复”插入将工作(会导致错误代替) – 2012-08-16 10:47:54

+0

重复行一个与table1中的行完全相同或列的子集定义唯一性? – 2012-08-16 12:16:02

+0

@NikolaMarkovinović它是定义唯一性的Table1Col1,Table1Col2和TableCol3的子集。 – Aesir 2012-08-16 12:56:56

回答

1

Intersect(减去在SQL Server的术语)是没问题的,因为它比较整行。其他两种选择是not in/not exists/left joinmergeNot In仅适用于单列公钥,因此在这种情况下不存在问题。 In/Exists/Left join应该在SQL Server中相同的性能,所以我就用存在:

INSERT INTO Table1 
(
    Table1Col1, 
    Table1Col2, 
    Table1Col3, 
    Table1Col4, 
    Table1Col5 
) 
SELECT 
    Table2Col1, 
    Table2Col2 = constant1, 
    Table2Col3 = constant2, 
    Table2Col4 = constant3, 
    Table2Col5 = constant4 
FROM Table2 
WHERE 
    Condition1 = constant5 
AND 
    Condition2 = constant6 
AND 
    Condition3 = constant7 
AND 
    Condition4 LIKE '%constant8%' 
AND NOT EXISTS 
    (
     SELECT * 
     FROM Table1 target 
     WHERE target.Table1Col1 = Table2.Table2Col1 
      AND target.Table1Col2 = Table2.Table2Col2 
      AND target.Table1Col3 = Table2.Table2Col3 
    ) 

Merge用于同步两个表;它能够插入,更新和删除target table中的记录。

merge into table1 as target 
using table2 as source 
    on target.Table1Col1 = source.Table2Col1 
    AND target.Table1Col2 = source.Table2Col2 
    AND target.Table1Col3 = source.Table2Col3 
when not matched by target then 
    insert (Table1Col1, 
      Table1Col2, 
      Table1Col3, 
      Table1Col4, 
      Table1Col5) 
    values (Table2Col1, 
      Table2Col2, 
      Table2Col3, 
      Table2Col4, 
      Table2Col5); 

如果从表2列传输过程中计算,在not exists()情况下,你可以使用派生表到位表2中,这同样适用于merge例子 - 只需将您的查询代替参考表2。

3

由于您在SQL Server 2008上,因此可以使用merge语句。

您可以轻松地检查是否有行存在的基础上的一个键

是这样的:

merge TableMain AS target 
using TableA as source 
ON <join tables here> 
WHEN MATCHED THEN <update> 
WHEN NOT MATCHED BY TARGET <Insert> 
WHEN NOT MATCHED BY SOURCE <delete> 
+0

感谢迭戈,我对SQL比较陌生,您能否将您提供的更多合并示例与WHERE子句以及常量值的插入关联起来? – Aesir 2012-08-16 10:56:39