SQL Вставка данных из промежуточной таблицы в две другие таблицы - PullRequest
0 голосов
/ 26 марта 2009

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

промежуточный стол выглядит так:

UserID, GroupID, FirstName, LastName, EmailAddress

У меня есть три другие соответствующие таблицы в базе данных. Таблица контактов, таблица групп и таблица сопоставления контактов с группами.

Contacts:
ID, UserID, FirstName, LastName, EmailAddress

Groups
ID, UserID, Name, Description

ContactGroupMapping
ID, ContactID, GroupID

Таблица ContactGroupMapping просто отображает контакты в группы. Надеемся, что промежуточная таблица теперь имеет смысл, она содержит детали каждого импортированного контакта плюс группу, в которую они также должны быть сопоставлены.

Я планировал выполнить запрос к базе данных после SqlBulkCopy, чтобы переместить данные из промежуточной таблицы в таблицы Contacts и ContactGroupMapping. В настоящее время у меня есть запрос, который выглядит примерно так:

INSERT INTO Contacts (UserID, FirstName, LastName, EmailAddress)

SELECT DISTINCT [t1].UserID, [t1].EmailAddress, [t1].FirstName, [t1].LastName FROM ContactImportStaging as [t1]
WHERE NOT EXISTS 
(
    SELECT UserID, EmailAddress, FirstName, LastName FROM Contacts
    WHERE UserID = [t1].UserID AND EmailAddress = [t1].EmailAddress AND FirstName = [t1].FirstName AND LastName = [t1].LastName
)

Итак, моя проблема в том, что, хотя при этом все отдельные контакты вставляются в мою таблицу контактов, у меня нет возможности добавить соответствующую строку в таблицу сопоставления для каждого вновь вставленного контакта.

Единственное решение (возможно, потому что я сосу на SQL), которое я могу придумать, состоит в том, чтобы иметь дополнительное пустое поле в таблице контактов, идентифицирующее группу, с которой должен быть связан контакт, и вставлять это тоже. Затем я мог бы выполнить второй запрос, чтобы выбрать все контакты со значением в этом столбце и вставить в таблицу сопоставлений.

Есть мысли о том, как такого рода вещи должны быть достигнуты наиболее эффективно?

Спасибо.

Редактировать: Для уточнения модели объекта: Есть любое количество контактов и любое количество групп. Контакт может быть в группе посредством записи в таблице ContactGroupMapping. Один контакт может быть в любом количестве групп. На уровне базы данных эта модель относится к трем таблицам Contacts , Groups и ContactGroupMapping . Мне нужно переместить одну строку из промежуточной таблицы и создать две строки; один в таблице контактов и один в таблице ContactGroupMapping.

1 Ответ

2 голосов
/ 26 марта 2009

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

После копирования CSV, скажем, в StagingTable, трюк состоит в том, чтобы разделить его на другие таблицы. Поскольку на ваш CSV теперь можно ссылаться в базе данных, вы можете объединить другие таблицы, чтобы получить идентификатор новой таблицы:

insert into ContactGroupMapping
select cont.ID, grp.ID
from StagingTable stag
inner join Contacts cont on cont.UserID = stag.UserID
inner join Groups grp on grp.GroupID = stag.GroupID

Еще более простым решением было бы сохранить исходный GroupID и UserID. Заполнение GroupContactMapping будет таким же простым, как:

insert into ContactGroupMapping
select UserID, GroupID
from StagingTable stag
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...