我有一个表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
任何帮助将不胜感激, 提前谢谢
答案 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)