合并SQL Server 2008中的两个表,同时重新编号主键列值

问题描述:

我有两个表tab1tab2(具有相同的模式)驻留在不同的数据库中。 这些表格的主键列aud_ID的值可能相似。合并SQL Server 2008中的两个表,同时重新编号主键列值

请注意主键列aud_ID不是标识列。

我有任务合并第三个表tab3(具有相同的模式)中的两个表的数据。 这里面临的挑战是对主键列值tab3重新编号。

  1. 要么的tab1主键列将首先被拷贝到tab3然后tab2数据将被插入到tab3开始的tab1.aud_id最大值。

    OR

  2. 主键列aud_id从1

任何想法重新编号,如何实现这一目标?

问候, PRASHANT ..

+0

你不在乎任何'aud_ID'值保持?如果没有,那么你可以重新编号所有行?如果是这样,那么解决方案很简单... – 2012-07-09 13:25:29

+0

当然,如果主键被其他表中设置的任何外键引用,问题会稍微复杂一些... – 2012-07-09 13:38:27

+0

@PhilipKelley我必须假设自从OP扔掉tab2中的现有值,表示没有任何关系需要维护。 – 2012-07-09 13:39:17

如果aud_id值是数字(和你没有需要避免的差距),你可以这样做:

insert into tab3 (/* Columns */) 
select (aud_id *2)-1,/* Other Columns */ from tab1 
union all 
select (aud_id *2),/* Other Columns */ from tab2 

这样的话,你能保证产生独特的价值,而不必检查任何一张桌子。通过保持公式化,如果需要,可以使用它复制其他表的引用。

+0

谢谢@Damien您的建议... – Prashant 2012-07-09 14:07:23

假设你没有需要保留现有的任何aud_ID值:

INSERT dbo.tab3(aud_ID, other cols) 
SELECT aud_ID = ROW_NUMBER() OVER (ORDER BY aud_ID), other cols 
FROM 
(
    SELECT aud_ID, other cols FROM dbo.tab1 
    UNION ALL 
    SELECT aud_ID, other cols FROM dbo.tab2 
) AS x; 
+0

谢谢@Aron ...这是有道理的...任何建议,如果我必须保持aud_id值的tab1然后重新编号为tab2从tab1的最大值开始? – Prashant 2012-07-09 14:02:17

+0

你忘记'INTO'就在'INSERT'之后? – Bellash 2013-11-28 20:37:26

+1

@Bellash不,我没有忘记它。 INTO是可选的,并且不会造成混淆或模棱两可。你还会插入什么?在......之外?旁?附近? – 2013-11-28 22:57:45