在2个表格中插入数据

时间:2019-10-10 09:24:41

标签: sql sql-server

我有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

3 个答案:

答案 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

}

谢谢大家的时间。