gpt4 book ai didi

sql - "Merging"T-SQL 中的两个表 - 替换或保留重复的 ID

转载 作者:行者123 更新时间:2023-12-02 02:37:29 24 4
gpt4 key购买 nike

我有一个 Web 应用程序,它使用一个相当大的表(数百万行,大约 30 列)。我们称其为 TableA。在这 30 列中,该表有一个名为“id”的主键,还有一个名为“campaignID”的列。

作为应用程序的一部分,用户能够上传与新“事件”相关的新数据集。

这些数据集与 TableA 具有相同的结构,但通常只有大约 10,000-20,000 行。

新数据集中的每一行都有一个唯一的“id”,但它们都共享相同的 campaignID。换句话说,用户正在加载新“事件”的完整数据,因此所有 10,000 行都具有相同的“事件 ID”。

通常,用户正在为新事件上传数据,因此表 A 中没有具有相同事件 ID 的行。由于“id”对于每个事件都是唯一的,因此每行新数据的 id 在 TableA 中都是唯一的。

但是,在极少数情况下,用户尝试为数据库中已有的“事件”加载一组新行,要求首先从 TableA 中删除该事件的所有旧行,然后插入来自新数据集的新行。

所以,我的存储过程很简单:

  1. 将新数据批量插入临时表 (#tableB)
  2. 删除表 A 中具有相同 campaignID 的所有现有行
  3. INSERT INTO Table A ([columns]) SELECT [columns] from #TableB
  4. 删除#TableB

这工作得很好。

但新要求是在用户上传新数据时为用户提供 3 个选项以处理“重复项”——用户正在为已在 TableA 中的事件上传数据的情况。

  1. 删除 TableA 中具有相同 campaignID 的所有数据,然后插入#TableB 中的所有新数据。 (这是旧行为。使用此选项,它们永远不会重复。)
  2. 如果#TableB 中的一行与 TableA 中的一行具有相同的 ID,则使用 #TableB 中的行更新 TableA 中的该行(实际上,这是用新数据“替换”旧数据)
  3. 如果#TableB 中的某行与 TableA 中的某行具有相同的 ID,则忽略#TableB 中的该行(本质上,这是保留原始数据并忽略新数据)。

用户无法逐行选择。她选择数据的合并方式,并将此逻辑应用于整个数据集。

在我使用 MySQL 的类似应用程序中,我使用了“LOAD DATA INFILE”函数,以及“REPLACE”或“IGNORE”选项。但我不知道如何使用 SQL Server/T-SQL 执行此操作。

任何解决方案都需要足够高效以处理 TableA 有数百万行,而#TableB(新数据集)可能有 10k-20k 行的事实。

我在谷歌上搜索了类似“合并”命令的东西(SQL Server 2008 似乎支持的东西),但我只能访问 SQL Server 2005。

在粗略的伪代码中,我需要这样的东西:

如果用户选择选项 1:[我已准备就绪 - 我可以正常工作]

如果用户选择选项 2(替换):

merge into TableA as Target
using #TableB as Source
on TableA.id=#TableB.id
when matched then
update row in TableA with row from #TableB
when not matched then
insert row from #TableB into TableA

如果用户选择选项 3(保留):

merge into TableA as Target
using #TableB as Source
on TableA.id=#TableB.id
when matched then
do nothing
when not matched then
insert row from #TableB into TableA

最佳答案

这个怎么样?

选项 2:

begin tran;
delete from tablea where exists (select 1 from tableb where tablea.id=tableb.id);
insert into tablea select * from tableb;
commit tran;

选项 3:

begin tran;
delete from tableb where exists (select 1 from tablea where tablea.id=tableb.id);
insert into tablea select * from tableb;
commit tran;

至于性能,只要 tablea(大表)中的 id 字段被索引,就可以了。

关于sql - "Merging"T-SQL 中的两个表 - 替换或保留重复的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/796077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com