在数据库迁移期间从多个相关表插入

时间:2012-12-24 10:32:34

标签: sql sql-server tsql

我正在通过链接服务器将Oracle DB迁移到SQL Server。这是我的问题;

我有这样的关于Oracle的表:

OldPersonelTable

PERSONID SSN  COUNTRY   CITY
-------------------------------
   1     123  RUSSIA    MOSCOW
   2     124  TURKEY    ISTANBUL
   3     125  TURKEY    ANKARA

在我的新SQL Server数据库中,我有这样的表:

CountryTable

COUNTRYID COUNTRYNAME
---------------------    
1         RUSSIA
2         TURKEY

CITYTABLE

CITYID COUNTRYID CITYNAME
-------------------------    
1          1      MOSCOW
2          2      ISTANBUL
3          2      ANKARA

NewPersonelTable

PERSONID SSN  COUNTRY   CITY
1        123   1          1
2        124   2          2
3        125   2          3

是的,这就是全部。我只想写一个插入查询从OldDatabase中选择并插入到新的personel表中。旧数据库没有任何城市和国家/地区ID表。只有你看到城市和国家名称才有机会加入。

编辑:城市名称不是唯一的。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

假设已填充CITYTABLECountryTable,您可以像这样填充NewPersonelTable

如果PERSONID是NewPersonelTable的主键,那么您可能需要这样做:

SET IDENTITY_INSERT ON

然后运行:

INSERT INTO NewPersonelTable ( PERSONID, SSN, COUNTRY, CITY )
SELECT T.PERSONID, T.SSN, C.COUNTRYID, CITY.CITYID
FROM OldPersonelTable T JOIN CountryTable C ON
  T.COUNTRY = C.COUNTRYNAME JOIN CITYTABLE CITY ON
  T.CITY = CITY.CITYNAME AND
  C.COUNTRYID = CITY.COUNTRYID

答案 1 :(得分:0)

执行此迁移任务需要分两步: 1-复制主数据 2-复制关系数据

首先确保新表主键是IDENTITY。 如下: 1)复制数据

INSERT INTO CountryTable(COUNTRYNAME)
SELECT DISTINCT COUNTRY FROM OraLink...OldPersonelTable

INSERT INTO CityTable(CITYNAME)
SELECT DISTINCT CITY FROM OraLink...OldPersonelTable

INSERT INTO NewPersonelTable(SSN)
SELECT DISTINCT SSN FROM OraLink...OldPersonelTable

2)复制关系

UPDATE CityTable SET COUNTRYID=CountryTable.COUNTRYID 
FROM OraLink...OldPersonelTable O INNER JOIN CountryTable
ON O.Country=CountryTable.COUNTRYNAME
WHERE CITYNAME=City

UPDATE NewPersonelTable SET COUNTRY=CountryTable.COUNTRYID, CITY=CityTable.CITYID
FROM OraLink...OldPersonelTable O INNER JOIN CountryTable
ON O.Country=CountryTable.COUNTRYNAME
INNER JOIN CityTable ON O.CITY=CityTable.CITYNAME
WHERE NewPersonelTable.SSN=O.SSN