2


0

SQL-更新されたIDシードを使用した別の挿入内へのクエリの挿入

2つのテーブルT1およびT2があります

T1にはプライマリキー(IDシード)を持つ10の一意のレコードがあり、T2にはT1の各レコードの外部キーを持つ複数の全体があります

T1には2つの列があります:PrimaryKey-DATA + T2には2つの列があります:PrimaryKey-FoeignKey(このFKはT1の主キーです)

T1からすべてのレコードを選択し、それ自体に新しいエントリを挿入するクエリを作成する必要があります。 T1は同じデータで、T1のPKはIDシードであるため、新しいIDが自動生成されます。この新しいIDが生成されるとすぐに、T2を結合し、この新しいIDで新しい関連レコードを挿入する必要があります。

私はこれがデータを複製することを知っており、それは問題ではありません、これは1回限りのトランザクションなので、クエリは効率的である必要はありませんが、カーソルを使用しないでください。外部変数! +ありがとう!!

更新:T1にエントリがある場合、テーブルT2に対応するエントリ/エントリが必要であると常に示唆するわけではありません。

P.S. SQL Server 2005を使用している

2 Answer


2


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


テーブルに現在のアクティビティがない場合、次のようにデータが正確に複製されます。 動的なSQLである必要はありません-開始IDシードを自動化するだけです。

テーブルに他のデータがある場合、これを簡単に操作して、そのデータを複製したり結合したりできます。

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