2016-07-31 1 views
2
여기

내가 함께 참여하고있는 테이블의 예입니다 (참고 : 테이블이 동일한 스키마를 가지고 있지만 다른 데이터베이스에, 나는 그들을 결합하려고) :숫자가 참여 테이블보다 크거나 같은 모든 행을 업데이트하는 방법은 무엇입니까?

Database 1 Table 

UniqID UniqID2 Number 
100  150  1 
100  151  2 

Database 2 Table 

UniqID UniqID2 Number 
100  152  2 
100  153  3 

내가 표 2를 병합하려고를 Table1에 들어가면 Table1.UniqID = Table2.UniqID에 가입합니다. 나는 숫자 열에서 모든 중복 값을 원하지 않는다, 이것은 내가 결과가 같이 할 것입니다 :

Table 1 

UniqID UniqID2 Number 
100  150  1 
100  151  2 
100  152  3 
100  153  4 

이것은 내가 지금까지 가지고있는 쿼리입니다,하지만 그것은 단지 표 2에 행을 갱신 Number = 2이고 Number = 3 행을 증가시키지 않습니다. 그렇게하려면 내 쿼리를 어떻게 조정할 수 있습니까?

UPDATE db2 
Set db2.Number = db2.Number + 
(SELECT MAX(Number) FROM [Database 1]..db1 WHERE UniqID = db2.UniqID) 
FROM [Database 2]..table db2 
INNER JOIN [Database 1]..Table db1 
ON db1.UniqID = db2.UniqID 
AND db1.Number = db2.Number 

그리고 이것은 내 데이터베이스 2 표 결과 지금처럼 무엇인가 :

Database 2 Table 

    UniqID UniqID2 Number 
    100  152  3 
    100  153  3 

기본적으로, 유일한 차이점은 내가 번호 = 3이 두 번째 열에서 번호 = 4 일 할 것입니다 .

답변

1

나는 당신이 union all 쿼리 및 insert 싶은 생각 ..

insert into table1(UniqID, UniqID2, Number) 
    select t2.UniqID, t2.UniqID2, 
      (x.maxn + row_number() over (order by (select null))) 
    from table2 t2 cross join 
     (select max(number) as maxn from table1) x; 
+0

over() 절을 채운 다음이 작업을 수행했습니다. 감사합니다. – cjw

+0

@cjw. . . 그것은 잘못 누락되었습니다. 'order by' 절을 추가했습니다. 특정 열을 기준으로 주문할 수 있습니다. –

0

다른 appraoch는 SQL 2012에서 작동

UPDATE t2 
SET t2.Number = t1.T1Number + 1 
FROM table2 t2 
INNER JOIN (SELECT uniqid, uniqid2, number as T1Number from Table1 
union 
SELECT uniqid, uniqid2, number as T1Number from Table2 
) t1 
ON t1.uniqid = t2.uniqid and t1.UniqID2 = t2.UniqID2-1 
0

또 하나 개의 방법이 될 수를

Demo here

;With cte 
as 
(select * 
from 
#t 
union all 
select * 
from #t1 
) 
select uniqid,uniqid2, 
case when lag(number) over (order by uniqid,uniqid2) is null then number 
when lead(number) over (order by uniqid,uniqid2) is null 
then number+1 else lead(number) over (order by uniqid,uniqid2) end as nextnumber 
from cte 
관련 문제