Вставить и связать записи в одном запросе SQL? - PullRequest
1 голос
/ 14 сентября 2010

Я пытаюсь скопировать данные из старой базы данных в новую и преобразовать ее в соответствии с новой структурой БД. Старый выглядел примерно так:

Таблица 1:

Id | Col A 
----------
1      0
2      8
3      7
4      1

В новой базе данных таблица 1 теперь выглядит следующим образом, где данные из столбца A теперь находятся в другой таблице и связаны с таблицей 1 через столбец внешнего ключа A_Id:

Таблица 1:

Id | A_Id_FK
----------
1      0
2      1
3      2
4      3

Таблица 2:

Id | Col A
----------
0      0
1      8
2      7
3      1

Итак ... Я очень увлечен своими навыками SQL. Мне нужен однократный (читай: скорость не имеет значения) запрос для создания записей Таблицы 2 с одновременной связью их с записями Таблицы 1. Еще один момент, который стоит упомянуть, это то, что у меня есть две базы данных. Один - старый с Таблицей 1, а второй - новый с пустой Таблицей 2 и Таблицей 1, в которой есть вся другая информация, кроме A_Id_FK, которая на данный момент просто связана с пустой записью в Таблице 2 за каждую запись.

Заранее спасибо.

Редактировать - для большей ясности таблица 2 в новой БД пуста. Col A в старой базе данных НЕ является уникальным числом (на самом деле это вообще не число, а просто для простоты). Таблица 1 в новой базе данных заполнена, но значение в A_Id_FK установлено равным 1, чтобы все просто имело действительный внешний ключ. Наконец, даже идентичные записи Col A нуждаются в собственном экземпляре в новой базе данных.

Ответы [ 3 ]

2 голосов
/ 14 сентября 2010

Вы можете использовать CURSOR (Table_2.id - это идентификатор):

DECLARE @id INT
DECLARE @col_a VARCHAR(50)
DECLARE db_cursor CURSOR FOR 
    SELECT id, col_a
    FROM Table_Source

OPEN db_cursor  
    FETCH NEXT FROM db_cursor INTO @id, @col_a

WHILE @@FETCH_STATUS = 0  
BEGIN  
    INSERT INTO Table_2 (col_a) VALUES (@col_a)
    INSERT INTO Table_1 (id, fk) VALUES (@id, @@IDENTITY)

    FETCH NEXT FROM db_cursor INTO @id, @col_a
END  

CLOSE db_cursor  
DEALLOCATE db_cursor
0 голосов
/ 14 сентября 2010

Я предполагаю, что идентификатор в таблице 2 является идентификатором в коде ниже.

insert into Table2
    (ColA)
    select distinct ColA
        from OldTable1

insert into Table1
    (Id, A_Id_FK)
    select ot.Id, t2.Id
        from OldTable1 ot
            inner join Table2 t2
                on ot.ColA = t2.ColA
0 голосов
/ 14 сентября 2010

Предполагая базы данных «Старые» и «Новые» со структурами таблиц, описанными выше, предполагая, что обе базы данных присутствуют в одном и том же экземпляре SQL, предполагая, что каждое значение «ColA» в Старой таблице1 присутствует в Новой таблице2, и предполагая, что что вы загружаете данные в первый раз, одна версия будет:

INSERT New.dbo.Table1 (Id, A_Id_FK)
 select Old.Id, New2.Id
  from Old.dbo.Table1 Old
   inner join New.dbo.Table2 New2
    on New2.ColA = Old.ColA

Похоже, вы, возможно, уже населили New..Table1? Если это так, вам понадобится какой-то оператор обновления, который связывает эту таблицу со Old..Table1 и New..Table2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...