我有2张桌子:
表T1
Id Test Question
-----------------
1 Test1 Q
2 Test2 Q
3 Test3 Q
表T2
ID T1_ID Ans
------------
1 1 A1
2 1 A2
3 2 B1
4 2 B2
5 2 B3
6 3 C1
7 3 C2
我正在使用select
语句插入具有不同问题值的T1值
Insert into T1 (Test, Question)
Select Test, 'P' From T1
类似地,我想复制T2的数据,T1.Id应该是问题p的T1表中新生成的ID,因此,如果T2有问题Q的7条记录,那么P也应该有7条记录,但是新生成的T1表的id问题P。
Insert into T2 (T1_ID, Ans)
Select (T1_ID where Question=P), Ans From T2
输出
表T1
Id Test Question
-----------------
1 Test1 Q
2 Test2 Q
3 Test3 Q
4 Test1 P
5 Test2 P
6 Test3 P
表T2
ID T1_ID Ans
------------
1 1 A1
2 1 A2
3 2 B1
4 2 B2
5 2 B3
6 3 C1
7 3 C2
8 4 A1
9 4 A1
10 5 B1
11 5 B2
12 5 B3
13 6 C1
14 6 C2
答案 0 :(得分:1)
在SQL Server中,一种方法使用output
子句:
declare @ids table (id int);
insert into T1 (Test, Question)
output inserted.id into @ids
select Test, 'P' ;
insert into T2 (T1_ID, Ans)
select ip.id, t2.Ans
from t2 cross join
@ids ip;
或者,只需搜索:
insert into T2 (T1_ID, Ans)
select t1.id, t2.Ans
from t2 join
t1
on t1.question = 'P';
答案 1 :(得分:0)
我找到了一种可以做自己想要的事情的方法。感觉有点,但我看不到更好的方法(尽管有人可能会来跟我矛盾)。您应该将所有这些内容包装在一个事务中,以确保其正常运行而不会受到干扰。
它的工作原理是简单地计算插入的行数,并假设生成的ID是从现有的最高编号之后的下一个可用编号开始连续的。 (例如,在先前已从表末尾删除行的情况下,这可能会失败)。我看不到任何其他方法可以在t2和ID列表之间创建有意义的关系。
declare @ids table (id int);
insert into t1 (test, question)
output inserted.id into @ids
select test, 'P' from t1;
declare @cnt int;
select @cnt = count(id) from @ids;
insert into t2 (t1_id, ans)
select i.id, t2.ans
from t2
left join @ids i on i.id = (t2.t1_id + @cnt)
演示:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=305347d11d2c18f6a4ce3bc3d4b516f3
答案 2 :(得分:0)
对我来说有用的是
{
DECLARE @LoopCounter INT , @MaxCounter INT,@DestinationQ NVARCHAR(100),@SourceQ NVARCHAR(100)
SET @SourceQ='Q'
SET @DestinationQ ='P'
SELECT @LoopCounter = min(Id) , @MaxCounter = max(Id)
FROM T1 where Question=@SourceQ
WHILE(@LoopCounter IS NOT NULL AND @LoopCounter <= @MaxCounter)
BEGIN
declare @NewlyGeneratedID table (New_ID int)
Insert INTO T1 (Test, Question)
OutPut inserted.Id into @NewlyGeneratedID
SELECT Test, @DestinationQ From T1 WHERE Question=@SourceQ and Id = @LoopCounter;
insert into T2 (T1_ID, Ans)
Select (Select Max(New_ID) from @NewlyGeneratedID),Ans From T2 Where T1_ID=@LoopCounter
SELECT @LoopCounter = min(Id) FROM T1 WHERE Id > @LoopCounter and Question=@SourceQ
END
}
谢谢大家的时间。