我的数据库包含三个名为Object_TableData_TableLink_Table的表.链接表只包含两列,即对象记录的标识和数据记录的标识.

我想复制DATA_TABLE中的数据,它链接到一个给定的对象标识,并为不同的给定对象标识在Data_TableLink_Table中插入相应的记录.

我通过 Select 一个表变量并循环每次迭代两次插入来实现这一点.

这是最好的方法吗?

Edit:我想避免循环有两个原因,第一个原因是我很懒,循环/临时表需要更多的代码,更多的代码意味着会有更多的地方出错,第二个原因是担心性能.

我可以在一次插入中复制所有数据,但是如何让链接表链接到每个记录都有新id的新数据记录?

推荐答案

下面使用表变量设置了我的情况.

DECLARE @Object_Table TABLE
(
    Id INT NOT NULL PRIMARY KEY
)

DECLARE @Link_Table TABLE
(
    ObjectId INT NOT NULL,
    DataId INT NOT NULL
)

DECLARE @Data_Table TABLE
(
    Id INT NOT NULL Identity(1,1),
    Data VARCHAR(50) NOT NULL
)

-- create two objects '1' and '2'
INSERT INTO @Object_Table (Id) VALUES (1)
INSERT INTO @Object_Table (Id) VALUES (2)

-- create some data
INSERT INTO @Data_Table (Data) VALUES ('Data One')
INSERT INTO @Data_Table (Data) VALUES ('Data Two')

-- link all data to first object
INSERT INTO @Link_Table (ObjectId, DataId)
SELECT Objects.Id, Data.Id
FROM @Object_Table AS Objects, @Data_Table AS Data
WHERE Objects.Id = 1

多亏了另外answer个让我指向输出子句的例子,我可以演示一个解决方案:

-- now I want to copy the data from from object 1 to object 2 without looping
INSERT INTO @Data_Table (Data)
OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId)
SELECT Data.Data
FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId
                INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id 
WHERE Objects.Id = 1

然而,事实证明,由于以下错误,在现实生活中并不是那么简单

OUTPUT INTO子句不能打开

我仍然可以在一张临时表上输入OUTPUT INTO个字符,然后以正常插入结束.所以我可以避免我的循环,但我不能避免临时表.

Sql相关问答推荐

获取家谱树中第一次出现的特定信息,然后停止

无法找到正确的SQL查询需求

在多个柱上连接时,如何确定连接条件?

如何在presto/SQL中使用两个数组列创建(分解)单独的行

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

查找表中特定值的上次更新日期

查询每周数据(周一至周日),避免年度日期重叠

在SQL中为两个日期之间的每个日期添加行

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

多条件SQL排序行为

两个月之间的WHERE CASE WHEN-ORA-00905:缺少关键字

显示十进制列,但尽可能显示为整数

Athena 计算从日期到当前时间戳的每月计数

给定 3 个键列,从一个表中 Select 另一表中不存在的所有数据

如何在 SQL 中将两行(或多行)jsonb 数组合并为一行

SQL 将 Varchar 转换为日期

避免在SQL中使用具有相同条件的多个子查询

创建定时器以更新Gridview

为数组中的每个元素从表中收集最大整数

有条件求和