SQL - запрос вставки внутри другой вставки с обновленным семенем идентификации - PullRequest
2 голосов
/ 08 октября 2010

У меня 2 таблицы Т1 И Т2

T1 имеет 10 уникальных записей с первичным ключом (Identity Seed)
T2 имеет несколько входов с внешним ключом для каждой записи в T1

T1 имеет 2 столбца: PrimaryKey - DATA
T2 имеет 2 столбца: PrimaryKey - FoeignKey (этот FK является первичным ключом T1)

Мне нужно написать запрос, который выберет все записи из T1 и вставит новые записи в себя, т.е. T1, с теми же данными, и, поскольку PK на T1 является тождественным, это автоматически сгенерирует новый идентификатор, как только этот новый идентификатор генерируется, мне нужно присоединиться к T2 и ВСТАВИТЬ новые связанные записи с этой новой идентификацией.

Я знаю, что это будет дублировать данные, и это не проблема, это разовая транзакция, поэтому запрос не должен быть эффективным, но НИКАКИХ курсоров, пожалуйста, было бы лучше, если бы этого можно было достичь, используя SELECT и INSERTS без делать циклы, используя внешние переменные!
Спасибо !!

ОБНОВЛЕНИЕ: Если есть запись в T1, не всегда предполагается, что в таблице T2 должны быть соответствующие записи / записи.

P.S. Я использую SQL Server 2005

Ответы [ 2 ]

2 голосов
/ 08 октября 2010

Предполагая, что первичный ключ на T2 также IDENTITY, используйте:

-- Populate T1
INSERT INTO T1
SELECT data
  FROM T1

-- Populate T2 with T1 values
INSERT INTO T2
SELECT primary_key
  FROM T1 x
 WHERE EXISTS(SELECT NULL
                FROM T2 y
                JOIN T1 z ON z.primary_key = y.foreign_key
               WHERE z.data = x.data
                 AND z.primary_key != x.primary_key)
1 голос
/ 08 октября 2010

Если в таблице нет текущей активности, что-то вроде следующего будет точно дублировать данные. Это не обязательно должен быть динамический sql - это просто для автоматизации начального идентификатора.

Если у вас есть другие данные в таблицах, вы можете легко работать с ними, чтобы дублировать эти данные или присоединиться к ним.

declare @maxID int

select @maxID = max(pk)
from T1

declare @sql nvarchar(max)
set @sql = 
'create table #T1
(
 new_pk int not null identity(' + cast(@maxID as varchar) + ',1)
 ,old_pk int
 ,data nvarchar(max)
)

insert into #T1 (old_pk, data)
select pk, data
from T1

insert into T1 (data)
select data
from #T1

insert into T2 (fk)
select new_pk
from #T1
inner join T2 on T2.fk = #T1.old_pk

drop table #T1
'

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