SQL中如何复制表避免游标?

2023-11-22

我想用 SQL 编写脚本,将这 2 个表(A,B)复制到其他 2 个表(C,D),其结构与 A,B 相应。

重要的:

  1. 表C、D是NOT必要的空
  2. 多个进程可以同时调用脚本

表A具有表B的外键(fk_a_b)

   ________________________  _________________
   |        Table A       |  |   Table B     |  
   |______________________|  |_______________|
   | id     FK_A_B   name |  | id    visible |
   | ----- -------- ------|  | ----- --------|
   | 1      21       n1   |  | 21     true   |
   | 5      32       n2   |  | 32     false  |
   ------------------------  -----------------

假设将表 B 复制到 D 后,这就是我得到的结果

   ________________
   |   Table D    |  
   |______________|
   | id   visible |
   | ----- -------|
   | 51    true   |
   | 52    false  |
   ----------------

现在,当我将表 A 复制到 C 时,我需要知道 ID=21 现在映射到 ID=51,ID=32 映射到 ID=52。最后,表C将是:

   ________________________
   |        Table C       |
   |______________________|
   | id     FK_C_D   name |
   | ----- -------- ------|
   | 61      51       n1  |
   | 62      52       n2  |
   ------------------------

因为多个进程可能同时调用脚本,所以我无法更改表 A、B 来添加一些辅助列。因此,为了实现这一目标,我使用了 CURSOR。我逐行复制表 B 和托管临时表,将 OldId 映射到 NewId(21->51,32->52),然后使用此临时表复制表 A。

我读过 CURSOR 是不好的做法。那么,还有其他方法吗?

谢谢


您可以将输出子句与 merge 语句一起使用来获取源 id 和目标 id 之间的映射。 在这个问题中进行了描述。使用 merge..output 获取 source.id 和 target.id 之间的映射

这是一些您可以测试的代码。我使用表变量而不是真实的表。

设置样本数据:

-- @A and @B is the source tables
declare @A as table
(
  id int,
  FK_A_B int,
  name varchar(10)
)

declare @B as table
(
  id int,
  visible bit
)  

-- Sample data in @A and @B
insert into @B values (21, 1),(32, 0)
insert into @A values (1, 21, 'n1'),(5, 32, 'n2')


-- @C and @D is the target tables with id as identity columns
declare @C as table
(
  id int identity,
  FK_C_D int not null,
  name varchar(10)
)

declare @D as table
(
  id int identity,
  visible bit
)  

-- Sample data already in @C and @D
insert into @D values (1),(0)
insert into @C values (1, 'x1'),(1, 'x2'),(2, 'x3')

复制数据:

-- The @IdMap is a table that holds the mapping between
-- the @B.id and @D.id (@D.id is an identity column)
declare @IdMap table(TargetID int, SourceID int)

-- Merge from @B to @D.
merge @D as D             -- Target table
using @B as B             -- Source table
on 0=1                    -- 0=1 means that there are no matches for merge
when not matched then
  insert (visible) values(visible)    -- Insert to @D
output inserted.id, B.id into @IdMap; -- Capture the newly created inserted.id and
                                      -- map that to the source (@B.id)

-- Add rows to @C from @A with a join to
-- @IdMap to get the new id for the FK relation
insert into @C(FK_C_D, name)
select I.TargetID, A.name 
from @A as A
  inner join @IdMap as I
    on A.FK_A_B = I.SourceID

Result:

select *
from @D as D
  inner join @C as C
    on D.id = C.FK_C_D

id          visible id          FK_C_D      name
----------- ------- ----------- ----------- ----------
1           1       1           1           x1
1           1       2           1           x2
2           0       3           2           x3
3           1       4           3           n1
4           0       5           4           n2

您可以在这里测试代码:https://data.stackexchange.com/stackoverflow/q/101643/using-merge-to-map-source-id-to-target-id

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL中如何复制表避免游标? 的相关文章

  • 如何将可变数量的参数传递给 SQL Server 存储过程?

    我将 SQL Server 2005 用于我的小型 Web 应用程序 我想将参数传递给 SP 但有一个条件 可以不时更改的参数数量 想一想 这次我传递姓名和地址 下次我传递姓名 地址 该参数范围可以是 1 30 您使用默认参数声明该过程 并
  • SQL Server 中带条件的多个计数函数

    我想合并 SQL Server 中的一些表 我想要获得的是如下图所示的东西 假设我有 tes A tes B tes C 和 tes jumlah 表 tes jumlah 是 tes A tes B 和 tes C 表的组合 请注意 ju
  • 如何使用Entity Framework Code First CTP 5存储图像?

    我只是想弄清楚是否有一种简单的方法可以使用 EF Code First CTP 5 存储和检索二进制 文件 数据 我真的很希望它使用 FILESTREAM 类型 但我真的只是在寻找某种方法让它工作 我总是创建另一个类 例如ProductIm
  • 从关键字后的文本中提取字符串

    我想从 SQL 字段中关键字后面的文本中提取内容 我有一个名为Description在表中 该字段的内容是 asdasf 关键字 狗 aeee 关键字 猫 ffffaa 关键词 狼 我想提取并保存 关键字 之后的文本 在本例中dog cat
  • MySQL - 如何将列逆透视到行?

    ID a b c 1 a1 b1 c1 2 a2 b2 c2 如何将行重新组织为ID columntitle value 1 a1 a 1 b1 b 1 c1 c 2 a2 a 2 b2 b 2 c2 c 你正在尝试unpivot数据 My
  • SQL准备语句如何通过多个可能的菜单选择进行选择?

    所以我有 4 个菜单选择 产品 位置 课程类型和类别 所有这些都可以为空 使用 JSF 编程 但这应该与这个问题无关 因为它是一个 SQL 问题 菜单选择将向托管 bean 发送用户选择的变量 并使用准备好的语句使用用户选择的菜单中的信息
  • 如何在oracle sql查询中提取括号之间的字符串

    我正在尝试从字符串中提取括号之间的值 我怎样才能做到这一点 例如 我有这个字符串 Gupta Abha 01792 我想得到括号之间的结果 即 01792 我正在尝试编写这样的查询 select substr Gupta Abha 0179
  • 如何在存储过程中查找数据表列引用

    我更改了 SQL Server 2005 数据库表中的列名称 我还有一个相当大的存储过程集合 它们可能引用也可能不引用该列 有没有办法找到哪些存储过程引用该列 而无需实际遍历每个存储过程并手动搜索它 有没有办法自动查找哪些存储过程现在会中断
  • 与派生表的内连接

    我对连接派生表的基本语法有疑问 这是使用的基本语法吗 select from table1 a inner join select from table2 as T1 on 1 ID T1 ID 那行得通吗 您是在问加入两个子查询吗 尝试
  • 如何在 Hibernate 中使用 SELECT 进行 INSERT

    我需要在休眠中实现以下请求 insert into my table max column values select max id from special table where 如何在休眠中使用注释来做到这一点 Special tab
  • 将多个子查询作为值插入

    假设我要插入一个有很多 fk 的表 只是为了在下面解释一下错误的说法 insert into mytable values somevalue somevalue select id from othertable1 where condi
  • SQL Server 2008 R2 中的字符映射/逐字符搜索和替换

    我在 SQL Server 2008 R2 上运行 我们在这里有一个要求 即我需要创建将某些英文字符替换为以前在遗留系统中使用的区域设置语言字符 为此 我可能会使用 T SQL 中的替换函数 但在我的实践中 我们会逐个字符地替换 例如 AS
  • 如何为多用户应用程序实现简单的锁定机制?

    我真的不想在这里重新发明井 所以我寻求在多用户数据库应用程序中实现简单 行 锁定机制的想法 假设我有一个名为Products其中当然有一个ID PK 还有一个rowversion列 到目前为止尚未使用 我只想允许one用户能够编辑特定行 当
  • 将具有重复值的数据插入 Postgresql

    我需要在 postgresql 中插入数据集 INSERT INTO table subject topics exams name of subject section topic subtopic VALUES Algebra Math
  • 将 XML 文件读取到已存在的数据库表中

    我正在尝试将 XML 文件读入已存在的数据库表中 问题是 XML 标签和数据库列的名称不同 尽管它们具有相同的数据类型 因此 我想将 XML 标签 翻译 到数据库列中 以便可以输入数据库 不过我不知道该怎么做 这是我到目前为止所做的 sta
  • 将 SQL Server 2008 查询分成多个批次

    我正在尝试准备一些数据供第三方删除 不幸的是他们只能批量处理 2000 条记录的数据 我有 100k 条记录 可能需要多次分割和导出这些数据 所以我想以某种方式自动化该过程 有没有一种相当简单的方法可以使用 SQL Server 2008
  • 实体框架与oracle数据库的连接

    我使用的是 Entity Framework 6 1 版本和 oracle 11 我是实体框架的新手 任何人都可以建议连接 oracle 的先决条件是什么 任何更改都需要在 web config 中进行 在web config中 默认它是与
  • 在插入 SQLite 之前检查表 B 中的日期是否在表 A 中的日期之间

    我有一个名为 项目 的表 其中包含开始日期和结束日期 我还有一个名为 Plan 的表 它有自己的开始日期和结束日期列 但我通过某种方式验证计划开始 结束日期是否在匹配的项目开始 结束日期之间 我不知道在创建表或向计划表中插入行时添加检查是否
  • 如何为基于服务的数据库设置自动增量

    我在这里开始构建我的第一个本地数据库 基于服务的数据库 使用文本框将行写入基于服务的数据库 https stackoverflow com questions 39152801 write line to service based dat
  • MYSQL 语法在存在 NULL 时不评估不等于

    我在 mysql 查询时遇到问题 我想排除 2 的值 所以我想我会执行以下操作 table products id name backorder 1 product1 NULL 2 product2 NULL 3 product3 2 SE

随机推荐

  • 以编程方式将 svg 转换为图像

    我正在尝试将 svg 转换为图像 我一直在研究几种工具 但仍然无法实现这一点 1 SVG渲染引擎但我遇到了麻烦 因为它没有文档 这是我的代码 using FileStream fileStream File OpenRead C sampl
  • 使用 Python 删除或删除 CSV 文件中的最后一列

    我有一个包含 5 列的 CSV 文件 使用Python 如何删除最后一列 示例中的header5 我是否缺少一种简单的方法 或者我是否必须循环遍历 CSV 中的所有行并从最后一列中删除每个值 这仍然可能会给我留下不需要的前置逗号 我在 CS
  • 使用 SQLAlchemy 和多处理挂入 Python 脚本

    考虑以下 Python 脚本 它使用 SQLAlchemy 和 Python 多处理模块 这是 Debian squeeze 上的 Python 2 6 6 8 b1 默认 和 SQLAlchemy 0 6 3 3 默认 这是一些实际代码的
  • ListView 内的 Horizo​​ntalScrollView:较小的垂直滚动停止水平滚动

    在我的示例活动中 我有 一个ListView包含 包含多个Horizo ntalScrollView 一组TextView 但水平滚动体验相当糟糕 当我启动水平滚动 或快速滑动 时 我必须非常小心才能使其正常工作 一旦水平滚动包含 小的 垂
  • 使用 git filter-branch 删除除文件列表之外的所有内容的历史记录

    我正在尝试在两个 git 存储库之间移动一些文件repo1 and repo2 我有一个要移动的文件的简短列表 保留历史记录 三个要移动的文件repo1 libraryname file1 libraryname file2 tests l
  • 使用JarJar重新打包工具

    我已将 Web 应用程序部署到 Google 应用程序引擎 并且我的 Web 服务使用 jersey 1 14 框架 当我尝试使用或调用 GAE 上的 Web 服务时 我收到 java lang InknownClassChangeErro
  • 如何获取 Bokeh 小部件事件和属性的列表(可用于触发 Python 回调)

    真正的 一般 问题 我是 Bokeh 新手 我正在尝试构建一个可以根据小部件提供的输入动态更新的图 然而 对于大多数小部件来说 Python 回调的使用并没有完整记录 因此我陷入了困境 我如何知道应该使用哪种小部件方法来附加我的回调 我可以
  • if 语句中的组合框为 null

    我正在尝试编写一个 if 语句 其中如果某个组合框为空 那么它会运行代码的某个部分 如果其中有数据 然后它会运行另一个组合框 我写了这个 Private Sub ProjectAddSetDateAutoBtn Click If Proje
  • 从哪里下载 Iesi.Collections?

    尝试 nHibernate 它说找不到 Iesi Collections 我可以从哪里得到这个 如果 nHibernate 如此重要 它不应该随 nHibernate 下载一起提供吗 与 NHibernate 一起提供的 Iesi Coll
  • Flutter:Android Studio 中的内联测试覆盖率

    我正在 Flutter 中使用 Android Studio 3 3 1 在 Window 和 Ubuntu 上 开发一个开源 Android 应用程序 来源可在Github 该项目有一个测试文件 可以生成覆盖率数据 可以使用诸如连体服 这
  • VBA Excel 使用表名检查特定表是否存在

    我的 Excel 工作表中有几个表格 每个都有唯一的表名称 我想知道当前工作表中是否存在名为 Table123 的表 有人可以帮我解决这个问题吗 谢谢 吉万 TableExists False On Error GoTo Skip If A
  • 让 make 在特定目录中创建目标文件

    GNU Make 3 82 gcc 4 7 2 c89 我有以下制作文件 INC PATH I home dev tools apr include apr 1 LIB PATH L home dev tools apr lib LIBS
  • PyVISA 未在 Linux 上列出 USB 仪器

    我正在尝试从 Raspberry Pi 与 LeCroy WaveRunner 640Zi 示波器进行通信 它们通过 USB 电缆连接 我已经在 Windows 下做到了这一点 但现在我无法让它在 Linux 下工作 如果我跑lsusb我看
  • 在 JavaScript 中导入、重命名和导出函数?

    使用 JavaScript 导入命名导出 重命名并再次导出的最短方法是什么 这段代码可以工作 但感觉比应有的更冗长 import mock as myFunctionMock from context myFunction export c
  • Android Studio 4.1 中的 navigation.json 是什么?

    我今天刚刚尝试了 Android Studio 4 1 我启动了 Android Studio 并创建了空活动 然后使用 Android 虚拟设备运行它 然后失败并显示此错误 FAILURE Build failed with an exc
  • “返回 false;” 是什么意思?做?

    我编写了一个网页 用户可以在其中输入存储在数据库中的日志条目 然后使用以下命令检索并打印在页面上ajax 我还是很陌生ajax想知道是否有人可以向我解释一下是什么意思return false 在我的代码末尾做什么 有必要吗 如果我把第二个a
  • WebRTC/WebSocket 屏幕录制

    在我的用例中 我想记录屏幕活动并将其发送到服务器 非实时 我为此查看了一些博客 示例演示 但我找不到任何与此相关的内容 我可以找到很多实时流媒体音频 视频 但找不到屏幕录制 我有以下与此相关的问题 对于这个用例来说 哪一个是高效的 WebR
  • Objective C - 如何创建界面?

    我需要能够创建一个像您在 C 中创建的接口一样 以强制一组类实现某些方法 这在目标c中可能吗 您可以创建一个协议 它看起来像这样 在 MyProtocol h 中 protocol MyProtocol void myMethod void
  • 无限滚动和回调

    如果这与我之前的帖子冲突 我深表歉意 但我对无限滚动的整个回调函数非常困惑 希望有人可以帮助我 我正在将 Portfolio Slideshow Pro http madebyraygun com wordpress plugins por
  • SQL中如何复制表避免游标?

    我想用 SQL 编写脚本 将这 2 个表 A B 复制到其他 2 个表 C D 其结构与 A B 相应 重要的 表C D是NOT必要的空 多个进程可以同时调用脚本 表A具有表B的外键 fk a b Table A Table B id FK