Вставка данных в 2 таблицы - PullRequest
0 голосов
/ 10 октября 2019

У меня есть 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

Я вставляю значения T1, используя оператор select с другим значением вопроса

Insert into T1 (Test, Question) 
Select Test, 'P' From T1

Точно так же я хочу скопировать данные T2, T1.Id должен быть вновь сгенерированными идентификаторами из таблицы T1 для вопроса p, поэтому, если T2 имеет 7 записей для вопроса Q, тогда P также должен иметь 7 записей, но зановосгенерированный идентификатор таблицы T1 Вопроса 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 ]

1 голос
/ 10 октября 2019

В 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';
0 голосов
/ 11 октября 2019

Что для меня работает

{

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

}

Спасибо всем за ваше время.

0 голосов
/ 10 октября 2019

Я нашел способ сделать то, что ты хочешь. Это кажется немного хакерским, но я не вижу лучшего пути (хотя кто-то может прийти и противоречить мне). Вам, вероятно, следует обернуть все это в транзакцию, чтобы убедиться, что она работает правильно без помех.

Он работает просто путем подсчета количества вставленных строк и предположения, что сгенерированные идентификаторы начинаются с следующего доступного числа послесамый высокий из существующих. (Это может произойти сбой в случаях, когда строки были ранее удалены, например, из конца таблицы). Я не мог найти другого способа создать значимую связь между t2 и списком идентификаторов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...