2010-07-16 2 views
0

Я решил переписать базу данных, которая у меня плохо нормализована. Я создал новую базу данных, но теперь мне нужно переместить данные из старой базы данных в новую. Однако я не уверен, как это сделать. Например, в старой базе данных у меня есть таблица webDorms, которая выглядит следующим образом:SQL: нормализация кода/экспорт - импорт

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) 

В новой базе данных я разделить на это две таблицы зданий и жилищного строительства. Корпус выглядит следующим образом:

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) 

Я вручную заселен таблица Здания (это было около двадцати строк), но Housing таблицы (которая наиболее похож на предыдущая таблица webDorms) содержит около трехсот строк - и я бы не отказался от всех этих данных.

Любые предложения по наилучшему способу выполнения этого импорта?

+1

У вас есть новые таблицы в той же базе данных или в отдельной? Если они находятся в разных базах данных, можно ли каким-либо образом использовать инструкции SELECT/INSERT между ними? –

+0

Они находятся в отдельных базах данных - я могу использовать SELECT/INSERT и думать о том, как использовать SELECT INTO, но мне нужно пропустить некоторые столбцы (в таблице назначения) и преобразовать строки для корреляции идентификационных номеров (например, building_name к зданию) – davemackey

ответ

2

Если мне не хватает чего-то очевидного в вашем вопросе, сообщите мне, пожалуйста, с комментарием, но что не так с использованием запросов INSERT, чтобы скопировать данные вместо повторного набора данных?

+0

Можете ли вы дать мне образец того, как я могу это сделать? Самая большая дилемма заключается в том, что в некоторых старых столбцах данные являются строками, но в новой таблице должны быть целые (ID). Мне нужно выполнить это преобразование во время импорта. – davemackey

+0

Используйте ключевые слова CAST или CONVERT в запросе, чтобы получить данные в правильные форматы. Например, CAST (StringValueField as INT) – JohnFx

+0

Значения Tbe не являются строгим преобразованием из строки в целое. Скорее всего, существует еще одна таблица, в которой есть идентификаторы, которые коррелируют с каждым зданием. – davemackey

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). Затем загрузите эти два файла.

+0

Это выглядит хорошо ... Как насчет преобразования данных в строковые данные (ID)? – davemackey

+0

@ davemackey: String to integer. У вас есть ссылка SQL? Проверь это. Преобразование данных почти всегда автоматическое. –

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.

Вы указали нормализацию как причину перепроектирования таблицы, но вы еще не нормализировали все возможности. Тип номера и пол являются кандидатами здесь, также типы данных для максимальной и текущей занятости довольно большие, если вы не хотите иметь комнаты, которые позволяют 2 миллиарда человек. : 0)

+0

Да, я думал о нормализации типа комнаты и пола - но это создало бы больше работы, чем я могу обосновать на этом этапе, чтобы получить очень мало или вообще не практическую пользу. – davemackey

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 

[номер] и [Пол] должны быть добавлены вручную, или вы можете заполнить их по умолчанию во время вставки.

Это, конечно, после того, как вы заселена свой [здание] стол, который можно было бы сделать:

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

Тогда заселять ваш [building_name] вручную (вместо ввода всех данных).

+0

Спасибо, это очень полезно. Хотя, по-видимому, вы не можете использовать Y/N для бит. :(Но я добавлю еще один столбец в старую таблицу и сделаю преобразование вручную ... – davemackey

+0

Вы можете обернуть его в футляр и задать результат 1 или 0 с уважением (чтобы избежать необходимости вручную). изменил мой пост, чтобы отразить это. – rickp

+0

Спасибо, Рик. Я закончил это, добавив еще один столбец - но это было не сложно - я буду держать дело в виду для будущей справки. – davemackey

Смежные вопросы