21

我正在尝试使用“OPENQUERY”将记录从 MS SQL Server 插入 MySQL 数据库,但我想做的是忽略重复的键消息。因此,当查询遇到重复时,请忽略它并继续。

我可以做些什么来忽略重复项?

这是我正在做的事情:

  1. 使用“OpenQuery”从 MySQL 中提取记录以定义 MySQL“A.record_id”
  2. 从这里将这些记录加入到 MS SQL Server 中的“具有特定条件而不是直接 ID”的记录中,我在 SQL Server 中找到了一个新的相关“B.new_id”记录标识符。
  3. 我想将找到的结果插入 MySQL 中的新表中,例如 A.record_id, B.new_id 在新表中,我将 A.record_id 设置为该表的主键。

问题是,有时将表 A 连接到表 B 时,我发现表 B 中有 2+ 条记录与我正在寻找的条件相匹配,这会导致我的数据集中的值 A.record_id 在插入表 A 之前达到 2+ 次这导致了问题。注意我可以使用聚合函数来消除记录。

4

2 回答 2

15

我不认为有一个特定的选择。但这很容易做到:

insert into oldtable(. . .)
    select . . .
    from newtable
    where not exists (select 1 from oldtable where oldtable.id = newtable.id)

如果有不止一组唯一键,您可以添加其他not exists语句。

编辑:

对于修改后的问题:

insert into oldtable(. . .)
    select . . .
    from (select nt.*, row_number() over (partition by id order by (select null)) as seqnum
          from newtable nt
         ) nt
    where seqnum = 1 and
          not exists (select 1 from oldtable where oldtable.id = nt.id);

row_number()函数为一组行中的每一行分配一个序号。组由partition by语句定义。数字从 1 开始并从那里递增。该order by条款说您不关心订单。每个 id 正好有一行的值为 1。重复行的值大于 1。每个seqnum = 1id 只选择一行。

于 2014-01-19T18:28:33.967 回答
14

如果您使用的是 SQL Server 2008+,则可以使用if 行MERGEINSERT存在或UPDATE.

例子:

MERGE
INTO    dataValue dv
USING   tmp_holding_DataValue t
ON      t.dateStamp = dv.dateStamp
        AND t.itemId = dv.itemId
WHEN NOT MATCHED THEN
INSERT  (dateStamp, itemId, value)
VALUES  (dateStamp, itemId, value)
于 2014-01-19T18:33:01.113 回答