SQL:规范化代码/导出 - 导入

时间:2010-07-16 14:25:41

标签: sql sql-server tsql import export

我决定重写一个标准化程度很低的数据库。我已经创建了新数据库,但现在需要将旧数据库中的数据移动到新数据库中。我不确定如何完成。例如,在旧数据库中,我有一个webDorms表,如下所示:

id (PK, int)
room_type (varchar) 
description (char) 
available (varchar) 
max_occupancy (varchar) 
current_occupancy (varchar) 
dorm_room (varchar) 
dorm_building (varchar) 
building_code (varchar) 

在新数据库中,我将其拆分为两个表格Buildings and Housing。住房看起来像这样:

id (PK, int) 
building (FK, int) 
room (nvarchar)
current_occupancy (int) 
max_occupancy (int) 
is_available (bit) 
gender (nvarchar) 
room_type (nvarchar)

建筑物看起来像这样:

id (PK, int) 
building_code (nvarchar) 
building_name (nvarchar)

我手动重新填充了Buildings表(它大约有二十行),但Housing表(与之前的webDorms表最相似)包含大约三百行 - 我宁愿不重新键入所有数据。

有关完成此导入的最佳方法的任何建议吗?

4 个答案:

答案 0 :(得分:2)

如果我在你的问题中遗漏了一些明显的东西,请通过评论告诉我,但使用INSERT查询复制数据而不是重新输入数据有什么问题?

答案 1 :(得分:1)

这是SQL具有SELECT DISTINCT - 规范化的一个原因。

来自源表的两个SELECT DISTINCT查询应创建生成的两个规范化表。

你有两种方法。

INSERT INTO new_table_1(...) AS SELECT DISTINCT a, b, c FROM old table
INSERT INTO new_table_2(...) AS SELECT DISTINCT d, e, f FROM old table

或者执行两个单独的查询以创建两个单独的提取文件(CSV格式)。然后加载这两个文件。

答案 2 :(得分:1)

你会想做这样的事情:

SELECT CAST(current_occupancy AS int) AS current_occupancy,
       CAST(max_occupancy AS int) AS max_occupancy,
       CAST(available AS bit) AS available

您需要在线查看图书,特别是CAST and CONVERT

您提到规范化是重新设计表格的原因,但您还没有规范化所有可能性。房间类型和性别在这里是候选人,最大和当前占用的数据类型相当大,除非您想要拥有允许20亿居住者的房间。 :0)

答案 3 :(得分:1)

看起来与此类似:

INSERT INTO ['database'].dbo.[housing] (id, building, current_occupancy, max_occupancy, room_type, is_available)
  SELECT id, [building].id, cast(current_occupancy as int), cast(max_occupancy as int), room_type, CASE available WHEN 'Y' THEN 1 ELSE 0 END)
  FROM ['database'].dbo.[webDorms]
  INNER JOIN ['database'].dbo.[building] ON [building].building_code = [webDorms].building_code

[Room]和[Gender]需要手动添加,或者您可以在插入期间使用默认值填充它们。

这当然是在您填充了[building]表后,可以通过以下方式完成:

INSERT INTO ['database'].dbo.[building] (building_code)
  SELECT DISTINCT building_code 
  FROM ['database'].dbo.[webDorms] 

然后手动填充[building_name](而不是键入所有数据)。