如何更新数字大于或等于连接表的每一行?

时间:2016-07-31 16:21:58

标签: sql sql-server

以下是我正在加入的表的示例(注意:这些表具有完全相同的模式但位于不同的数据库中,我正在尝试将它们组合在一起):

Database 1 Table 

UniqID UniqID2 Number 
100     150     1
100     151     2

Database 2 Table

UniqID UniqID2 Number 
100     152      2
100     153      3

我正在尝试将Table2合并到Table1中,并且我正在加入Table1.UniqID = Table2.UniqID。我不希望在Number列中有任何重叠值,这就是我想要的结果:

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

基本上,唯一的区别是我希望Number = 3在第二列中为Number = 4.

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

不同的appraoch可能是

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

答案 2 :(得分:0)

另一种适用于SQL 2012的方法..

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