2

我正在尝试将一些数据从一个表插入到另一个表中,但我想防止插入重复的行。我目前有以下查询:

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%'

我不知道的是,我试图从 Table2 插入 Table1 的行可能已经存在,我想防止这种可能的重复发生并跳过插入,然后继续插入下一个唯一行。

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

编辑:

我应该补充一点,从 TableCol2 到 TableCol5 的列实际上并不存在于结果集中,我只是在返回的 Table2Col1 旁边填充这些列。

4

3 回答 3

3

由于您使用的是 SQL Server 2008,因此可以使用合并语句。

您可以根据键轻松检查行是否存在

像这样的东西:

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>
于 2012-08-16T10:36:08.390 回答
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);

如果在传输期间计算 table2 中的列,not exists()以防您可能使用派生表代替 table2,这同样适用于merge示例 - 只需将您的查询放置在 table2 的引用位置。

于 2012-08-16T13:31:02.057 回答
1

我们检查了表中是否已经存在数据。为此,我们必须使用If 条件来避免重复插入

于 2012-10-24T03:34:03.547 回答