Установить основанную вставку в две таблицы с отношением от 1 до 0-1

StackOverflow https://stackoverflow.com/questions/1012468

Вопрос

У меня есть две таблицы: первая имеет первичный ключ, который является идентификатором, вторая имеет первичный ключ, которого нет, но этот ключ имеет ограничение внешнего ключа обратно к первичному ключу первой таблицы.

Если я вставляю по одной записи за раз, я могу использовать Scope_Identity, чтобы получить значение для pk, только что вставленного в таблицу 1, которое я хочу вставить во вторую таблицу.

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

Мое текущее решение - использовать курсор, вставить в первую таблицу, получить ключ с помощью scope_identity, вставить во вторую таблицу, повторить.

Мне не хватает решения без курсора?

Это было полезно?

Решение

Да, посмотрите предложение вывода в Книгах онлайн.

Другие советы

У меня была эта проблема только на этой неделе: кто-то ввел в схему таблицу с бессмысленным суррогатным ключом, где естественным образом используются ключи. Без сомнения, я скоро это исправлю :) до тех пор я работаю над этим, создавая таблицу данных для INSERT из: это может быть постоянная или временная базовая таблица или производная таблица ( см. ниже), которая в любом случае должна соответствовать вашему желанию решения на основе множеств. Используйте соединение между этой таблицей и таблицей со столбцом IDENTITY в натуральном ключе, чтобы найти автоматически сгенерированные значения. Вот краткий пример:

CREATE TABLE Test1 
(
 surrogate_key INTEGER IDENTITY NOT NULL UNIQUE, 
 natural_key CHAR(10) NOT NULL CHECK (natural_key NOT LIKE '%[^0-9]%') UNIQUE
);

CREATE TABLE Test2
(
 surrogate_key INTEGER NOT NULL UNIQUE
    REFERENCES Test1 (surrogate_key), 
 data_col INTEGER NOT NULL
);

INSERT INTO Test1 (natural_key)
SELECT DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col);

INSERT INTO Test2 (surrogate_key, data_col)
SELECT T1.surrogate_key, DT1.natural_key
  FROM (
        SELECT '0000000001', 22
        UNION ALL 
        SELECT '0000000002', 55
        UNION ALL 
        SELECT '0000000003', 99
       ) AS DT1 (natural_key, data_col)
       INNER JOIN Test1 AS T1
          ON T1.natural_key = DT1.natural_key;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top