SQL:将一个表中的数据插入到彼此相关的两个表中

时间:2013-05-14 11:10:07

标签: sql sql-server

我有一个表tSource,它是笛卡尔积的SELECT结果,所以集中没有唯一的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

任何帮助将不胜感激, 提前谢谢

3 个答案:

答案 0 :(得分:2)

在MERGE + OUTPUT语句中完成两个插入操作。

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

答案 1 :(得分:1)

第1部分 - :

insert into tbl1(f1)  select f1 from tSource;

第2部分 - :

Insert into Tabl2 (tbl1_id,f2)
(
Select id,f2 from (Select Row_Number() Over(Partition by id order by id) as row,t1.f2,t2.id from t1 ,t2) a 
where row=(Select r from
( Select Row_Number() over(Order by id)as r,id  from t2) b where b.id=a.id)
)

这里选择第2部分返回.... SQL Fiddle Demo

答案 2 :(得分: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)