0

デカルト積の SELECT 結果であるテーブル tSource があるため、セットに一意の ID はありません。簡単に言うと、テーブルは次のようになります。

tSource
-------
f1 | f2
-------
 H |  a
 I |  b
 J |  c
 K |  d
 K |  d

tSource のデータを、互いに関連する tbl1 と tbl2 に「分割」する必要があります。

tbl1             tbl2
-------          -----------------
ID | f1          ID | tbl1_ID | f2
-------          -----------------
11 |  H          51 |      11 |  a
12 |  I          52 |      12 |  b
13 |  J          53 |      13 |  c
14 |  K          54 |      14 |  d
15 |  K          55 |      15 |  d

両方の宛先テーブルの ID 列は INT IDENTITY です

事前に感謝します。

4

3 に答える 3

2

MERGE + OUTPUT ステートメントで 2 つの挿入操作をまとめて実行します。

merge @table2 as t2
using (
    select *
    from @table
) as src
on (1 = 2)
when not matched then
    insert (f1)
    values (src.f1)
output inserted.ID, src.f2 into @table3 (f1ID, f2)
;

完全な例:

declare @table table (
    f1 char(1)
    , f2 char(1)
)

insert @table
values
('H', 'a')
, ('I', 'b')
, ('J', 'c')
, ('K', 'd')


declare @table2 table (
    ID int not null identity
    , f1 char(1)
)

declare @table3 table (
    ID int not null identity
    , f1ID int not null
    , f2 char(1)
)

merge @table2 as t2
using (
    select *
    from @table
) as src
on (1 = 2)
when not matched then
    insert (f1)
    values (src.f1)
output inserted.ID, src.f2 into @table3 (f1ID, f2)
;

select *
from @table2

select *
from @table3
于 2013-05-14T11:51:43.447 に答える
0

これは完全に正しいSQLではありません(型がわからないため)が、アイデアは得られると思います

create table tbl1(ID primary key identity, f1, f2)

insert into tbl1(f1, f2) select f1, f2 from tSource

create table tbl2(ID primary key identity, tbl1_ID not null, f2)

insert into tbl2(tbl1_ID, f2) select ID, f2 from tbl1

alter table tbl1 drop column f2

alter table tbl2 add constraint myForeignKey foreignkey(tabl1_ID) references tbl1(ID)
于 2013-05-14T11:17:15.473 に答える