2012-06-24 3 views
0

내가 가진 테이블 A와 B idaidb :삽입 기록 정체성 PK와있는

전직 A :

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

전직 B :

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는 볼 것이다 예를 들면 다음과 같습니다.

이제 B와 A의 관계가 없으므로 B의 어떤 레코드가 A와 어느 것인가를 결정하려면 어떻게해야합니까? 루프에 하나씩 삽입하고 업데이트 할 수 있지만 많은 레코드에서 문제가 될 수 있습니다.

적은 수의 단계로이 작업을 수행 할 수 있습니까? 이 귀하의 요구 사항에 근거하여

+0

새로운'col3'과'col4' 값은 어디서 오는가? 그리고'B '테이블의'ida' 컬럼을 대신'idb'라고 부르면 안 될까요? – Andomar

+1

1 대 1 매핑 인 경우 테이블 A의 ID를 테이블 B에 저장하는 대신 다른 방법으로 저장하는 것이 어떻습니까? – Macros

+0

이 'Foriegn Keys'가있는 시나리오가 아닙니까?그래서 두 테이블 사이에 관계를 만들 수 있습니다. –

답변

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 @[email protected]+1 
    END 
+0

같은 방식은 아니지만 비슷한 접근 방식을 취했습니다. – JohnDoDo

1
당신이 테이블 B에 삽입을하는 MERGE 문을 구성 할 수 있습니다 경우이의 핵심은

을 달성하기 위해 시도 할 수있는 - 당신이 할 수있는 경우에 때문에, 당신은 을 참조하는 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 표현은, 내가 ID를 사용하고 여기에 테이블 A.의 값에 따라 col3col4에서 새 값을 도출하지만, 그러나 그것은 당신이해야 할 무엇이다 :

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가 포함, 그래서 업데이 트를 구성하는 간단 복사하는 다시 테이블 A에 새 ID를 :

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 
,