0

我有带有身份 PK 的表 A 和 Bidaidb

前答:

ida    col1     col2   idb
---------------------------
1      xxxx     foo    NULL
2      yyyy     bar    NULL

例如乙:

idb    col3     col4  
----------------------
110    uuuu     rrr  
111    vvvv     ttt   

对于 AI 中的每一行,必须在 B 中插入一行。然后我需要用我在 B 中插入的行的 ID 更新 A,同时保持它们之间的匹配。A 和 B 之间没有其他关系,也没有来自 A 的数据进入 B。

插入后,B 可能如下所示:

idb    col3     col4  
----------------------
110    uuuu     rrr  
111    vvvv     ttt   
112    aaaa     www    
113    bbbb     mmm    

更新 A 后,A 将如下所示:

ida    col1     col2   idb
---------------------------
1      xxxx     foo    112
2      yyyy     bar    113

现在的问题是,我如何确定 B 中的哪条记录对应于 A 中的哪条记录,因为它们之间没有关系?我可以在一个循环中一个一个地插入和更新,但是对于很多记录,这可能是有问题的。

有没有办法以更少的步骤做到这一点?

4

2 回答 2

1

根据您的要求,这是您可以尝试达到的结果

  Declare @countA int
  Declare @value int
  set @value =0
  Select @countA=count(*) from TableA

  while @value<@countA
  BEGIN
  Insert into TableB (idb,col3,Col4)
  select max(idb)+1,'aaa','BBBB' from TableB  --I don't know from where you get the values for col3    and col4
  Update TableA
  set idb=(Select max(idb) from TableB) where idb is null and @value+1=ida
  set @value=@value+1
  END
于 2012-06-24T09:04:06.173 回答
1

关键是您是否可以构造一个MERGE插入表 B 的语句 - 因为如果可以,您可以构造一个OUTPUT引用表 B 中新插入的行和表 A 中相应行的子句您可以INSERT不幸的是,不要用声明来做到这一点。

以下所有脚本都应该一次性运行,只需将它们拆分以显示正在发生的事情:

数据设置:

declare @TabA table (ida int IDENTITY(1,1),col1 char(4),col2 char(3),idb int)
insert into @TabA(col1,col2,idb) values 
('xxxx','foo',NULL),
('yyyy','bar',NULL)

declare @TabB table (idb int IDENTITY(110,1),col3 char(4),col4 char(3))
insert into @TabB(col3,col4) values
('uuuu','rrr'),
('vvvv','ttt')

MERGE被迫只做一个插入。在这里,CASE表达式是您从表 A 中的值派生新值col3col4基于表 A 中的值。在这里,我使用的是 ID,但这是您需要做的任何事情:

declare @Res table (ida int,idb int)

;merge into @TabB tb
using (select ida,col1,col2 from @TabA where idb is null) src
on 1 = 0
when not matched then insert (col3,col4) values (case src.ida when 1 then 'aaaa' else 'bbbb' end,case src.ida when 1 then 'www' else 'mmm' end)
output src.ida,inserted.idb into @Res;

现在,@Res包含来自两个表的匹配 ID,因此构造一个将新 ID 复制回表 A 的更新很简单:

update a set idb = r.idb
from @TabA a
inner join @Res r on a.ida = r.ida

结果:

select * from @TabA
select * from @TabB

ida         col1 col2 idb
----------- ---- ---- -----------
1           xxxx foo  112
2           yyyy bar  113

(2 row(s) affected)

idb         col3 col4
----------- ---- ----
110         uuuu rrr
111         vvvv ttt
112         aaaa www
113         bbbb mmm
于 2012-06-24T09:22:56.443 回答