Копирование данных из промежуточной таблицы в несколько таблиц
В 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