Как я могу импортировать в таблицу соединений в выражении на основе набора? - PullRequest
6 голосов
/ 27 декабря 2011

Я импортирую данные из плоского файла в нормализованную структуру таблицы. В настоящее время я использую курсоры для вставки в связанные таблицы, поэтому у меня есть первичные ключи для вставки в таблицу соединений. Могу ли я сделать это на основе набора в SQL Server 2008 R2?

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

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

Вот пример кода, пробующий его с OUTPUT. Я получил это почти работать, за исключением того, что я не мог ссылаться на import.contactId.

create table import(contactId int  identity, phone varchar(50), name varchar(10))
create table contacts (contactId int identity, name varchar(50))
create table contactPhone (contactId int, phoneId int)
create table Phones (phoneId int identity, number varchar(10))

go
insert into import (phone, name)
    select '1872', 'dave'
    union (select '9110', 'Jordan')

insert into contacts
    select name from import
insert into Phones (number)
    OUTPUT import.contactId, INSERTED.phoneId into contactPhone
    select phone from import

select * from contactPhone

Вот пример кода, с помощью которого выполняется слияние:

create table import(contactId int  identity, phone varchar(50), name varchar(10))
create table contacts (contactId int identity, name varchar(50))
create table contactPhone (contactId int, phoneId int)
create table Phones (phoneId int identity, number varchar(10))

go
insert into import (phone, name)
    select '1872', 'dave'
    union (select '9110', 'Jordan')

insert into contacts
    select name from import

MERGE phones target
    USING (select import.contactId, import.phone, import.name 
            from import join contacts on import.contactId = contacts.contactId) as source
    ON (target.contactId = source.contactId)
    WHEN MATCHED THEN 
        insert into Phones (number)
            OUTPUT import.contactId, INSERTED.phoneId into contactPhone
            select phone from import
    WHEN NOT MATCHED THEN   
        INSERT (name)
        VALUES (source.Name)
        OUTPUT INSERTED.*;



select * from contactPhone

Ответы [ 2 ]

2 голосов
/ 27 декабря 2011

Используйте merge для contacts и Phones и сохраните выходные данные в табличной переменной, которая будет использоваться при вставке в contactPhone.

insert into import (phone, name)
select '1872', 'dave' union all
select '9110', 'Jordan'

declare @ContactIDs table(SourceID int primary key, TargetID int)
declare @PhoneIDs table (SourceID int primary key, TargetID int)

merge contacts as c
using import as i
on 0 = 1
when not matched then
  insert (name) values (i.name)
output i.contactId, inserted.contactId into @ContactIDs;

merge Phones as p
using import as i
on 0 = 1
when not matched then
  insert (number) values (i.phone)
output i.contactId, inserted.phoneId into @PhoneIDs;

insert into contactPhone(contactId, phoneId)
select c.TargetID, p.TargetID
from import as i
  inner join @ContactIDs as c
    on i.contactID = c.SourceID
  inner join @PhoneIDs as p
    on i.contactID = p.SourceID  

Используя объединение ..вывод для отображения между source.id и target.id

http://data.stackexchange.com/stackoverflow/qt/122662/

0 голосов
/ 27 декабря 2011

Вы можете сделать это без слияния.Добавьте контакты и телефоны, а затем создайте отношения контакт-телефон, соответствующие таблице импорта:

insert into contacts
    select name from import;

insert into Phones
    select phone from import;

insert into contactPhone
    select  i.contactId
    ,       p.phoneId
    from    import i
    join    phones p
    on      p.number = i.phone
    join    contacts c
    on      c.name = i.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...