Как вставить из каждой строки в несколько таблиц - PullRequest
0 голосов
/ 19 декабря 2018

Я довольно новичок в SQL Server (использую ssms).Мне нужна помощь для вставки и организации данных из одной таблицы в несколько таблиц (которые связаны между собой PK / FK).

Исходная таблица имеет следующие столбцы:

Email, UserName, Phone

Это грязная таблица с большим количеством дубликатов: одно и то же письмо с другим именем пользователя и т. Д.

Мои таблицы данных:

  1. Person - PersonID (PK, int,не нуль)
  2. Email - электронная почта (nvarchar, ноль), PersonID (FK, int, не ноль)
  3. Phone - PhoneNumber (int, ноль), PersonID (FK,int, not null)
  4. UserName - UserName (nvarchar, null), PersonID (FK, int, not null)

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

Я искал здесь некоторые решения и нашел рекомендации по использованию CURSOR.Я попробовал, но выполнение заняло очень много времени (часов .. и все еще продолжается)

Спасибо за любую помощь!

пример: с>

EMAIL | USERNAME | PHONE
------------------------
a@a.a | john | 956165
b@b.b | smith | 123456
c@c.c | bob | 654321
d@d.d | mike | 986514
a@a.a | dan | 658732
e@e.e | dave | 147258
f@f.f | harry | 951962
b@b.b | emmy | 456789
g@g.g | kelly | 789466
h@h.h | kelly | 258369
a@a.a | ana | 852369

к>

EMAIL | PERSONID
----------------
a@a.a | 1
b@b.b | 2
c@c.c | 3
d@d.d | 4
e@e.e | 5
f@f.f | 6
g@g.g | 7
h@h.h | 8

USERNAME | PERSONID
-------------------
john | 1
smith | 2
bob | 3
mike | 4
dan | 1
dave | 5
harry | 6
emmy | 2
kelly | 7
kelly | 8
ana | 1

PHONE | PERSONID
----------------
956165 | 1
123456 | 2
654321 | 3
986514 | 4
658732 | 1
147258 | 5
951962 | 6
456789 | 2
789466 | 7
258369 | 8
852369 | 1

1 Ответ

0 голосов
/ 26 декабря 2018

Курсоры, как правило, будут работать медленнее, поскольку они работают построчно.Использование основанных на множестве операций, таких как объединение, даст лучшую производительность.Он несколько старше, но в этой статье подробно описываются последствия использования курсоров в отличие от операций над множествами.Я не совсем уверен, какие столбцы вы хотите использовать для проверки совпадений, а также какие данные добавить, но ниже приведен базовый пример, и вы можете заполнять столбцы по мере необходимости.Таблица Email была использована в примере.Для UPDATE это обновит существующие строки на основе соответствующих строк в исходной таблице.Будучи INNER JOIN, будут затронуты только строки с совпадениями с обеих сторон.Во втором операторе это INSERT, в котором используются только строки из исходной таблицы, которых нет в таблице электронной почты.Эту же функциональность также можно выполнить с помощью оператора MERGE, однако с этим связан ряд проблем, включая проблемы с блокировками и нарушениями ключа.

Обновление существующих строк:

UPDATE E
SET E.ColumnA = SRC.ColumnA,
E.ColumnB = SRC.ColumnB
FROM YourDatabase.YourSchema.Email E
INNER JOIN YourDatabase.YourSchema.SourceTable SRC
ON E.Email = SRC.Email

Добавить новые строки:

INSERT INTO YourDatabase.YourSchema.Email (ColumnA, ColumnB)
SELECT 
ColumnA, 
ColumnB
FROM YourDatabase.YourSchema.SourceTable 
WHERE EMAIL NOT IN ((SELECT EMAIL FROM YourDatabase.YourSchema.Email))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...