Вставить строку в таблицу для каждого идентификатора в другой таблице

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

У меня есть таблица с 17 миллионами + строк, у всех есть уникальный идентификатор. Недавно мы создали новую таблицу, которая будет использоваться вместе с предыдущей таблицей, где внешний ключ новой таблицы является уникальным идентификатором старой таблицы.

Например,
Таблица 1 - id, field1, field2, field3 ... table 2 - table1.id, field1 ...

Проблема в том, что, поскольку мы переносим это в живую среду, нам нужно заполнить таблицу 2 строкой, содержащей идентификатор из таблицы 1 для каждой строки в таблице 1. ex, table 1-1, test, null table 2 теперь требуется иметь: 1, null, ... и так далее для каждой строки в table1. Основная проблема заключается в том, что не все идентификаторы в таблице 1 являются последовательными, поэтому нам придется читать из таблицы 1, а затем вставлять на основе идентификатора найденного в таблицу 2.

Есть ли более простой способ сделать это? Заранее спасибо Джо

Также, чтобы уточнить, в таблице 2 будут новые данные, и единственное, что она будет содержать из таблицы 1, - это идентификатор для сохранения отношения внешнего ключа.

Также это sql server 2000


person obj63    schedule 14.01.2009    source источник


Ответы (4)


Вам необходимо прочитать эту статью.

Каковы наиболее распространенные антишаблоны SQL?

Основная проблема заключается в том, что не все идентификаторы в таблице 1 являются последовательными, поэтому нам придется читать из таблицы 1, а затем вставлять на основе идентификатора найденного в таблицу 2

Да, посмотрите мой ответ в статье выше и напишите цикл перебора ключей, используя пункт 2.

Убедитесь, что, когда вы пишете оператор вставки, вы предоставляете список полей - как я сказал в элементе №1.

person Amy B    schedule 14.01.2009

Если я правильно понимаю, вам нужна одна запись в таблице2 для каждой записи в таблице1. Также я считаю, что помимо ссылки на table1, table2 изначально должен содержать пустые строки.

Предполагая, что

table1 (ID, field1, field2, ...)
table2 (ID, table1_ID, fieldA, fieldB,...)
-- where table1_ID is a reference to ID of table1

После создания table2 вы можете просто запустить этот оператор вставки

insert into table2(table1_ID) 
select ID from table1
person kristof    schedule 14.01.2009

Я не уверен, что точно слежу за вами, но сработает ли что-то подобное для вас?

INSERT INTO table2 ( SELECT field1, field2, field3... FROM table1 )

Если я правильно понимаю, вам нужна запись в таблице2 для каждой записи в таблице1. Так и будет. Просто сопоставьте свои поля в выбранном в правильном порядке и укажите константы для любых полей в table2, которых у вас нет в table1.

HTH. Дайте мне знать, если я не понимаю, и я снова попытаюсь помочь.

person Ryan Guill    schedule 14.01.2009
comment
Работает ли этот синтаксис на сервере SQL? При попытке я получаю сообщение об ошибке: Ошибка рядом с SELECT. - person Trevor; 29.07.2013
comment
да, это должно работать и для sql server. Создайте вопрос с вашим синтаксисом, который выдает ошибку, и отправьте ссылку, если хотите. - person Ryan Guill; 02.08.2013
comment
Чтобы заставить его работать в SQL Server, мне пришлось написать: INSERT INTO table2 (field1, field2, field3) SELECT field1, field2, field3 FROM table1 - person ConnorsFan; 10.06.2014

С таким количеством строк вы можете столкнуться с проблемами, связанными с пространством журнала транзакций и длительностью выполнения больших транзакций вставки.

Если время выполнения является ограничением, я бы серьезно рекомендовал использовать Bcp (или любой другой инструмент, применимый в зависимости от платформы)

Выберите идентификаторы из исходной таблицы, используйте их для создания файла Bcp для таблицы расширений, затем введите его.

Многие находят Bcp более производительным в файлах из 10 000 записей, чем в одном файле humungus с 17 000 000 строк.

Кроме того, вы можете сделать это в фоновом режиме перед запуском и написать задание t-sql, которое можно было бы подобрать, и которое, возможно, было вставлено после того, как вы взяли оснастку id.

person Binary Worrier    schedule 14.01.2009