【问题标题】:How to ignore duplicate keys when extracting data using OPENQUERY while joining two tables?在连接两个表时使用 OPENQUERY 提取数据时如何忽略重复键?
【发布时间】:2014-02-08 20:10:48
【问题描述】:

我正在尝试使用“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 在插入之前达到 2 次以上进入导致问题的表A。注意我可以使用聚合函数来消除记录。

【问题讨论】:

  • @MartinSmith 我从我的问题中删除了令人困惑的部分。我尝试使用 IGNORE_DUP_KEY 但出现语法错误。我不知道我是否可以将它与 openquery 一起使用。这是我的用例 INSERT IGNORE_DUP_KEY OPENQUERY
  • IGNORE_DUP_KEY 是索引的属性。不是您在查询中使用的关键字。除非您插入到 SQL Server,否则它是不相关的,因此要求澄清传输方向。

标签: mysql sql-server sql-insert openquery


【解决方案1】:

我认为没有特定的选项。但这很容易做到:

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 = 1 每个 id 只选择一行。

【讨论】:

  • 感谢您的留言。问题是,在我的选择中,我可能会生成重复项,并且在插入 2 条具有相同唯一值的记录时出现错误,因为最初这些记录不存在,但是当尝试插入 2 次不同的值时,我遇到了错误。
  • 你能解释一下第二个查询吗?我从来没有使用过(分区......我不知道它是什么以及它做什么。我需要知道如何将它应用到我的查询中......
  • 这仍然对我有用。我重新陈述了我的问题以解释我遇到的问题。请审查。我认为你的答案是正确的
  • 我认为 row_number() over..... 语句没有按您的预期工作,因为我看到 2 行具有相同的 id 并且值为 1
  • “这很容易做到”——但它根本不像 INSERT IGNORE 那样简单。其实挺恶心的。
【解决方案2】:

如果您使用的是 SQL Server 2008+,如果行不存在,您可以使用 MERGE 执行 INSERT,或者使用 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)

【讨论】:

  • 看起来他正在尝试使用 OPENQUERY 从 MS Sql 向 MySql 插入记录。在这种情况下,我认为合并根本没有帮助。
  • 问题和标题令人困惑,而且相反。我查看了@Mike 在 SQL Server 中要求INGORE INSERT 等效于 MySQL 的标题。而 Question 则相反,即从 SQL Server 插入 MySQL。
猜你喜欢
  • 2022-09-18
  • 1970-01-01
  • 2011-09-24
  • 2021-04-07
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多