使用 T-SQL Merge 语句时如何避免插入重复记录

2024-04-13

我尝试使用 T-SQL 的 MERGE 语句插入许多记录,但当源表中存在重复记录时,我的查询无法 INSERT。失败的原因是:

  1. 目标表有一个基于两列的主键
  2. 源表可能包含违反目标表主键约束的重复记录(抛出“违反主键约束”)

我正在寻找一种方法来更改 MERGE 语句,以便它忽略源表中的重复记录和/或尝试/捕获 INSERT 语句以捕获可能发生的异常(即,所有其他 INSERT 语句都将运行,无论可能会出现一些坏鸡蛋)-或者,也许有更好的方法来解决这个问题?

这是我试图解释的查询示例。下面的示例将向临时表添加 100k 记录,然后尝试将这些记录插入目标表 -

EDIT在我原来的帖子中,我只在示例表中包含了两个字段,这让朋友们可以提供不同的解决方案,以避免 MERGE 语句中的重复。我应该提到,在我的实际问题中,表有 15 个字段,而在这 15 个字段中,其中两个字段是聚集主键。因此 DISTINCT 关键字不起作用,因为我需要选择所有 15 个字段并忽略基于其中两个字段的重复项。

我更新了下面的查询,添加了一个字段 col4。我需要在 MERGE 中包含 col4,但我只需要确保只有 col2 和 col3 是唯一的。

-- Create the source table
CREATE TABLE #tmp (
col2 datetime NOT NULL,
col3 int NOT NULL,
col4 int
)
GO

-- Add a bunch of test data to the source table
-- For testing purposes, allow duplicate records to be added to this table
DECLARE @loopCount int = 100000
DECLARE @loopCounter int = 0
DECLARE @randDateOffset int
DECLARE @col2 datetime
DECLARE @col3 int
DECLARE @col4 int

WHILE (@loopCounter) < @loopCount
BEGIN
    SET @randDateOffset = RAND() * 100000
    SET @col2 = DATEADD(MI,@randDateOffset,GETDATE())
    SET @col3 = RAND() * 1000
    SET @col4 = RAND() * 10
    INSERT INTO #tmp
    (col2,col3,col4)
    VALUES
    (@col2,@col3,@col4);

    SET @loopCounter = @loopCounter + 1
END

-- Insert the source data into the target table
-- How do we make sure we don't attempt to INSERT a duplicate record? Or how can we 
-- catch exceptions? Or?
MERGE INTO dbo.tbl1 AS tbl
    USING (SELECT * FROM #tmp) AS src
    ON (tbl.col2 = src.col2 AND tbl.col3 = src.col3)
    WHEN NOT MATCHED THEN 
        INSERT (col2,col3,col4)
        VALUES (src.col2,src.col3,src.col4);
GO

解决您的新规范。只插入col4的最高值:这次我使用了group by来防止重复行。

MERGE INTO dbo.tbl1 AS tbl 
USING (SELECT col2,col3, max(col4) col4 FROM #tmp group by col2,col3) AS src 
ON (tbl.col2 = src.col2 AND tbl.col3 = src.col3) 
WHEN NOT MATCHED THEN  
    INSERT (col2,col3,col4) 
    VALUES (src.col2,src.col3,src.col4); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 T-SQL Merge 语句时如何避免插入重复记录 的相关文章

  • 如何使用 SQLalchemy 连接三个表并将所有列保留在其中一个表中?

    所以 我有三张表 类定义 engine create engine sqlite test db echo False SQLSession sessionmaker bind engine Base declarative base cl
  • SQL Server:是否可以同时插入两个表?

    我的数据库包含三个表 称为Object Table Data Table and Link Table 链接表仅包含两列 对象记录的标识和数据记录的标识 我想从中复制数据DATA TABLE它链接到一个给定的对象标识并将相应的记录插入到Da
  • 想要显示图像

    我有一个小问题 我想要一个可以上传和显示图像的 Django 应用程序 目前 它可以上传图像 但无法显示该图像 例如 comment photo 将打印出路径C Users AQUIL Desktop myproject images P1
  • 在 SQL 表中的文本字符串中查找换行符?

    我试图在 SQL 表的列中查找换行符和回车符 但我不确定语法 I tried SELECT foo FROM test WHERE foo LIKE CHAR 10 尽管我知道该表应该返回结果 但我没有得到任何结果 我究竟做错了什么 SEL
  • 在 LINQ 中选择案例[重复]

    这个问题在这里已经有答案了 我怎样才能把它翻译成 LINQ 呢 select t age as AgeRange count as Users from select case when age between 0 and 9 then 0
  • 在 Transact SQL 中何时使用 EXCEPT 而不是 NOT EXISTS?

    我最近刚刚通过阅读同事编写的代码了解到 SQL Server 中存在新的 EXCEPT 子句 有点晚了 我知道 真的让我很惊讶 但是我对它的使用有一些疑问 建议什么时候使用它 使用它与使用 AND NOT EXISTS 的相关查询在性能方面
  • SQL WHERE 语句?

    如果我想返回 A 列为 null 或 B 列为 null 的行 但不返回两者都为 null 的行 那么我的 WHERE 子句应该在 SQL 语句中是什么 WHERE ColA is NULL AND ColB is NOT NULL OR
  • 似乎找不到循环 PL/SQL 数组的方法?

    我正在尝试这样做 arrCauses APEX UTIL STRING TO TABLE P1 CAUSE FOR c IN 1 arrCauses count LOOP INSERT INTO DT EVENT CAUSE EVENT I
  • 加入多对多关系

    我有三个表 applications permissions 和 applications permissions applications applications permissions permissions id lt applic
  • MySQL SUM 具有相同的 ID

    抱歉 这个真正简单的问题 我刚刚学习 PHP 和 MySQL 我已经在谷歌上搜索了一个多星期 但没有找到任何答案 我创建了一个简单的财务脚本 表格如下 table a aid value 1 100 2 50 3 150 table b b
  • 如何在 Windows 上的 PostgreSQL 中创建具有 UTF-8 排序规则的数据库?

    我正在为 Windows 上的 Bitbucket 服务器配置 PostgreSQL 数据库 在官方guide https confluence atlassian com bitbucketserver connecting bitbuc
  • Oracle 中的 TO_Char 数字格式模型

    我不完全理解如何使用 to char 函数将数字转换为具有适当格式模型的字符串 实际数字具有以下格式 使用逗号作为小数点分隔符 始终为 5 个小数 整数最多可达 6 可能是无限的 但目前绝不会超过 6 数字可以是正数或负数 数字可以以 0
  • MS-Access:合并彼此“下方”的两个表

    我的 Access 数据库中有两个表 它们看起来像这样 Table1 Kabelnummer Column1 Column2 Column3 1 x x x 2 x x x
  • 从另一列计算出的列?

    给出下表 id value 1 6 2 70 有没有办法添加根据同一个表中的另一列自动计算的列 与 VIEW 类似 但属于同一个表的一部分 举个例子 calculated将是一半value Calculated应该会自动更新value变化
  • 字段名称来自表 1 上的 ID,但来自其他表上的名称

    这是一个 Firebird 数据库 第一张表 联系人 Company ID 职位名称 第二个表 Client id 公司名称 在联系人中 我希望 job title 字段包含 co name client id 和 company id 相
  • 在SQL Server中,not(columnName='value')和columnName<>'value'之间有什么区别吗?

    在 SQL Server 的 where 子句中 无论您编写代码有什么区别not columnName value or columnName lt gt value 我正在考虑性能方面的问题 有人告诉我 当使用 Not 时 它可能不会使用
  • SQL 与 LINQ 性能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 SQL 计算每小时平均值

    我有一个包含 2 个字段的 SQL 表 时间戳和值 以下是部分数据的摘录 2005 02 17 13 31 00 2 2005 02 17 13 46 00 3 2005 02 17 14 01 00 1 7 2005 02 17 14 1
  • 选择返回动态列

    我有两个表 标准和服务产品 一个标准可以有多个服务产品 每个标准可以有不同数量的与其关联的服务产品 我需要做的是编写一个视图 该视图将返回一些常见数据 然后在一行上列出服务产品 例如 Standard Id Description SO 1
  • MySQL/Postgres查询5分钟间隔数据

    我需要查询方面的帮助 假设这是表中的数据 timestamp 2010 11 16 10 30 00 2010 11 16 10 37 00 2010 11 16 10 40 00 2010 11 16 10 45 00 2010 11 1

随机推荐

  • 如何将 Netezza 中的日期从时间戳格式转换为 yyyymmdd?

    如何将 Netezza 中的日期从时间戳格式转换为 yyyymmdd 使用以下查询转换为日期格式 select TO CHAR DATE 2009 12 23 23 45 58 YYYY MM DD or select TO CHAR TO
  • 如何获取子元素相对于父元素的位置?

    如果有 Canvas 父级 则很容易获得子级的位置 Canvas GetLeft Top child 但是对于其他类型的父母我怎样才能得到孩子的位置呢 可以使用以下方法完成TranslatePoint的控制方法 UIElement cont
  • Java、Lucene:在Java中设置IndexWriter的锁定超时。

    我正在致力于将 Lucene 与我们基于 Spring MVC 的应用程序集成 目前我们已经可以使用它了 但是我们很少得到cannot obtain lock错误 之后我必须手动删除锁定文件才能正常工作 如何在 Java 中设置锁定索引的超
  • 如何使用动态名称实现 property() (在 python 中)

    我正在对单个神经元进行模拟编程 因此我必须处理很多参数 现在的想法是我有两个类 一个用于 SingleParameter 一个用于参数集合 我使用 property 来轻松访问参数值并使代码更具可读性 这非常适合 sinlge 参数 但我不
  • iPhone、核心数据和 JSON

    我有一个带有 API 的网站 它使用 JSON 发布信息 我可以很好地访问这个 API 但我真的很想使用 Core Data 将信息存储在 iPhone 应用程序中 有没有办法将持久存储连接到 JSON API 这样我就可以使用网站作为核心
  • 在 istio 中为 envoy 启用 http 标头日志记录

    我希望能够捕获 日志 至少部分 envoy我的 HTTP 标头istio服务网格 我已经经历过envoy s docs https www envoyproxy io docs envoy latest start quick start
  • 具有“不同于”的子集函数?

    是否可以通过说 subset dataset IA LABEL not equal to Er or Sie or Es or wird or gleich 之类的东西来使用子集函数 我感兴趣的是 不等于 运算符 子集函数有类似的东西吗 谢
  • 从文本文件中读取字符串和整数

    假设我有一个如下所示的文件 51 41 52 07 52 01 51 22 50 44 49 97 Coal Diggers 77 26 78 33 78 29 78 12 77 09 75 74 Airplane Flyers 31 25
  • 用Java删除锁定的文件?

    我们必须使用 Windows 上运行的 Java 来删除一些目录及其内容 我担心会遇到被锁定的目录文件 我们可以调用Unlocker http www emptyloop com unlocker 进行删除 或者是否有更以 Java 为中心
  • 在 Swift 中通过 TouchID 生成哈希或字符串 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想在 Swift 中通过 iPhone 上的 Touch ID 创建一个唯一的字符串或散列 我搜索了很多 但没有找到解决方案 你不可以做这
  • 如何删除 POI 生成的 Excel 中的警告?

    I am using Apache POI for writing content into excel sheet after generating an excel in all the cells which ever cell ha
  • 当被调用的 Activity 退出时,如何以自然的方式返回结果?

    什么工作正常 我的应用程序中有 2 个活动 第一个活动调用第二个活动来获取结果 第二个活动显示了新的布局并允许用户执行某些操作 有一个 确定 按钮 当用户按下此按钮时 第二个活动完成并且用户返回到第一个活动 在幕后 第一个活动像这样调用第二
  • 颤动中底片内的文本框

    我有一个如下所示的底页 It has a text box inside it when I cliked on that I am getting something like 我的文本框完全被键盘覆盖 有什么办法可以解决这个问题吗 下面
  • 获取 Android 上的活动驱动程序列表

    有没有一种简单的方法来获取 Android 设备上当前使用的驱动程序列表 lsmod列出了少量驱动程序 3 但我猜测大多数驱动程序都编译到内核中而不是作为模块 显然 像这样的事情make menuconfig由于设备本身缺乏开发工具 没有机
  • 模板参数数量错误的模板参数

    考虑一个模板类 C 它具有通过模板模板参数设置的策略和两个策略定义 template
  • Python应用程序引擎:如何保存图像?

    这是我从 flex 4 文件参考上传中得到的 自我请求 Request POST UPLOAD Accept text Cache Control no cache Connection Keep Alive Content Length
  • 如何找到一个向量中与另一个向量最接近的值?

    我有两个大小相等的向量 例如 A 2 29 2 56 2 77 2 90 2 05 and B 2 34 2 62 2 67 2 44 2 52 我有兴趣在两个相同大小的向量 A 和 B 中找到最接近的值 几乎相等 即在 A 中的所有元素中
  • Zend 框架 website.com/username

    我正在使用 Zend Framework 开发的应用程序之一要求通过 website com username 访问用户的个人资料页面 而其他页面应通过 website com controller name action name 访问
  • 当从 DataTemplateSelector 显式返回 DataTemplate 时,为什么 DataTemplate 无法绑定到接口?

    我创建了一个 DataTemplateSelector 它是使用一组已知接口进行初始化的 如果传递到选择器的项目实现了这些接口之一 则返回关联的数据模板 首先 这是有问题的 ICategory 接口 public interface ICa
  • 使用 T-SQL Merge 语句时如何避免插入重复记录

    我尝试使用 T SQL 的 MERGE 语句插入许多记录 但当源表中存在重复记录时 我的查询无法 INSERT 失败的原因是 目标表有一个基于两列的主键 源表可能包含违反目标表主键约束的重复记录 抛出 违反主键约束 我正在寻找一种方法来更改