Импортировать данные и игнорировать дубликаты в SQL Server

#sql #sql-server-2008 #tsql

#sql #sql-server-2008 #tsql

Вопрос:

Я использую SQL Server 2008 R2. У меня есть исходная таблица данных (I_Vendor), в которой могут быть дубликаты в столбце CompanyName. Я хочу импортировать эти данные в новую таблицу (Vendor), но в новой таблице есть столбец Name (который соответствует CompanyName) с уникальным ограничением на него. Прошло некоторое время с тех пор, как я выполнял SQL, но я увидел функцию СЛИЯНИЯ, и, похоже, она соответствует всем требованиям. Я написал следующее:

 MERGE Vendor AS T
USING I_Vendor AS S
ON (T.Name = S.CompanyName) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(VendorId, Name, ContactName, ContactInfoId) 
        VALUES(S.Vendor_ID, S.CompanyName, S.ContactName, S.Vendor_ID 10000);
  

Он генерирует «Нарушение ограничения УНИКАЛЬНОГО КЛЮЧА» и присваивает имя уникального ограничения на Vendor.Name . Кто-нибудь знает, что я делаю не так?

Комментарии:

1. если в исходной таблице есть две строки с одинаковым названием компании и разным именем контакта, какое имя контакта вы хотите использовать в таблице поставщиков? аналогично, как насчет других столбцов?

2. Извините, что не выразился яснее. Имя контакта на самом деле не имеет значения, мне просто нужно получить чистый список всех имен поставщиков (плюс я хочу выяснить, как использовать команду слияния).

Ответ №1:

Ваш MERGE оператор вставит все строки из I_Vendor , которые не имеют совпадающей строки в Vendor таблице.

Например, предположим, что в I_Vendor таблице есть две строки с названием компании «X», и далее предположим, что название компании «X» не отображается в Vendor таблице, тогда обе строки будут вставлены в Vendor таблицу, нарушая ограничение.

Чтобы устранить проблему, вам необходимо убедиться, что в исходных данных MERGE инструкции есть только одна строка на название компании. Следующая инструкция merge выполняет это, но, как уже указала Адитья Найду, мы не знаем, что вы хотите делать, когда в I_Vendor таблице есть несколько записей с одинаковым названием компании:

 MERGE Vendor AS T
USING (SELECT MAX(Vendor_ID), CompanyName, MAX(ContactName), MAX(ContactInfoId)
       FROM I_Vendor
       GROUP BY CompanyName) AS S
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(VendorId, Name, ContactName, ContactInfoId) 
         VALUES(S.Vendor_ID, S.CompanyName, S.ContactName, S.Vendor_ID 10000);
  

Комментарии:

1. Спасибо за четкое объяснение и рабочий пример с командой СЛИЯНИЯ. Я думал, что как только появится первое имя контакта x, второе x не будет соответствовать. Я слишком долго был вдали от SQL и забыл, как мыслить, ориентируясь на набор.