Копирование данных из промежуточной таблицы в несколько таблиц

В SQL Server 2016 у меня есть промежуточная таблица [S] с 8 столбцами. Я хочу скопировать эти данные в 3 таблицы [A], [B] и [C]. [A] имеет FK для [B], а [B] имеет FK для [C]. Столбцы 1-2 должны идти к [c], столбец с 3 по [a] и столбцы с 4-8 по [B].

Может кто-нибудь сказать мне, как я могу это сделать? Эффективность не имеет первостепенного значения, как только 5,5Krows.

Любая помощь высоко ценится.

редактировать:

Должен был сделать это понятнее:

  • Таблицы a, b и c существуют и имеют PK и FK.
  • c имеет уникальное ограничение на конкатенацию col1 и col2.
  • a, b и c использовать IDENTITY PK
  • Данные для импорта были очищены от дубликатов.

2 ответа

Решение

Так эффективно ли вы разделяете строку из S на 3 таблицы? Почему бы не использовать первичный ключ из таблицы S вместо "связанного" ключа, который вы хотите использовать?

Вы по-прежнему сможете объединять данные так, как вам хочется, вы также можете объединять таблицы A и C без использования B.

ps Если у вас нет PK в S или вы не хотите копировать форму, вы все равно можете использовать суррогатный ключ в одной таблице и ссылаться на него из двух других.

Вот решение для таблицы C, вы можете настроить его для других таблиц:

CREATE TABLE c (
    ID int PRIMARY KEY
  , col1 int
  , col2 int
)
INSERT INTO c(id,col1,col2)
SELECT
    ROW_NUMBER() OVER(ORDER BY s.PrimaryKey)
  , s.col1
  , s.col2
FROM s

или же

INSERT INTO c(id,col1,col2)
SELECT
    s.PrimaryKey
  , s.col1
  , s.col2
FROM s

или (слишком неявно на мой вкус)

SELECT
    IDENTITY(int,1,1) AS ID
  , col1
  , col2
INTO c
FROM s
ORDER BY s.PrimaryKey

edit: если вы пытаетесь избавиться от избыточности, вы можете использовать DENSE_RANK() следующим образом (добавить / удалить ранг для ключей, которые вам нужны):

SELECT DISTINCT
    DENSE_RANK() OVER(ORDER BY col1) AS PK_a
  , s1.col1
INTO a
FROM s1

SELECT DISTINCT    
  DENSE_RANK() OVER(ORDER BY col2,col3) AS PK_b
  , DENSE_RANK() OVER(ORDER BY col1) AS FK_a
  , s1.col2
  , s1.col3
INTO b
FROM s1

SELECT DISTINCT
    DENSE_RANK() OVER(ORDER BY col4) AS PK_c
  , DENSE_RANK() OVER(ORDER BY col1) AS FK_a
  , DENSE_RANK() OVER(ORDER BY col2, col3) AS FK_b
  , col4
INTO c
FROM s1

В итоге я использовал инструмент Entity Framework 6 BulkInsert. Мне было легче работать с модельными классами, которые я уже определил. Я просто прочитал все объекты из промежуточного списка в список промежуточных объектов, затем перебрал их, построил a, b и c и, наконец, сохранил их все в одном вызове. 5.5K строк в менее чем 10 сек.

Спасибо за вашу помощь @Bistabil

Другие вопросы по тегам