2014-12-21 2 views
2

У меня есть следующая проблема во время работы Вкладыша заявления:дубликатов Вставить в & ограничении уникальности SQL Server 2008

я получил 2 таблицы: временная таблица с информацией заказа клиента импортируемой через SSIS (заказ-csv- импорт) и основную таблицу клиентов (Заказчик).

Одной из задач в работе я создал, чтобы создать клиент, если еще не существует:

insert into dbo.[Customer] (FirstName, LastName, PostalAddress1, PostalAddress2, 
          State_Prov, City, ZIPPostalCode, Country, 
          Email, BYear, BMonth, BDay, Gender, 
          CheckInDate, Check_In_by, Comments) 
    Select distinct 
     billing_first_name, 
     billing_last_name, 
     billing_address_1, 
     billing_address_2, 
     PADI_State, 
     billing_city, 
     bil ling_postcode, 
     PADI_Country, 
     billing_email, 
     BYear, 
     BMonth, 
     BDay, 
     Gender, 
     arrival_date, 
     '0', 
     customer_note 
    from 
     dbo.[orders-csv-import] OCI 
    where 
     not exists (select 1 
        from dbo.Customer TCI 
        where TCI.LastName = OCI.billing_last_name 
        and TCI.FirstName = OCI.billing_first_name 
        and TCI.BDay = OCI.BDay 
        and TCI.BMonth = OCI.BMonth 
        and TCI.BYear = OCI.BYear) 

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

Msg 2627, Level 14, State 1, Line 3
Нарушение UNIQUE ключа 'constraint_Unique_CUSTOMER_EXISTS'. Невозможно вставить дубликат ключа в объект «dbo.Customer».

Я изучил его, но все решения, которые я смог найти, основаны на идентификации дубликатов на вставке в целевой таблице.

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

Любые идеи?

ответ

0

Использование Window Function для удаления дубликатов

Чтобы избежать дубликата на основе ио вы создали вам нужно использовать оконную функцию

Row_number() OVER(partition BY billing_first_name, billing_last_name, 
           bday, 
           bmonth ,byear 
           ORDER BY bmonth, byear) Rn 

Сделать запрос на выборку в качестве суб выбрать и в внешнем запросе вы можете отфильтруйте дубликаты, проверив where Rn=1. Вставка должна быть как

INSERT INTO dbo.[customer] 
      (firstname, 
      lastname, 
      postaladdress1, 
      postaladdress2, 
      state_prov, 
      city, 
      zippostalcode, 
      country, 
      email, 
      byear, 
      bmonth, 
      bday, 
      gender, 
      checkindate, 
      check_in_by, 
      comments) 
SELECT DISTINCT billing_first_name, 
       billing_last_name, 
       billing_address_1, 
       billing_address_2, 
       padi_state, 
       billing_city, 
       billing_postcode, 
       padi_country, 
       billing_email, 
       byear, 
       bmonth, 
       bday, 
       gender, 
       arrival_date, 
       check_in_by, 
       customer_note 
FROM (SELECT billing_first_name, 
         billing_last_name, 
         billing_address_1, 
         billing_address_2, 
         padi_state, 
         billing_city, 
         billing_postcode, 
         padi_country, 
         billing_email, 
         byear, 
         bmonth, 
         bday, 
         gender, 
         arrival_date, 
         '0' check_in_by, 
         customer_note, Row_number() 
          OVER( 
          partition BY billing_first_name, billing_last_name, 
          bday, 
          bmonth ,byear 
          ORDER BY bmonth, byear) Rn 
     FROM dbo.[orders-csv-import] OCI 
     WHERE NOT EXISTS (SELECT 1 
          FROM dbo.customer TCI 
          WHERE TCI.lastname = OCI.billing_last_name 
            AND TCI.firstname = OCI.billing_first_name 
            AND TCI.bday = OCI.bday 
            AND TCI.bmonth = OCI.bmonth 
            AND TCI.byear = OCI.byear)) A 
WHERE rn = 1 
+0

Мммм ... буквально скопировать и вставить ... он бросает мне это: Msg 8155, уровень 16, состояние 2, строка 64 Без названия столбца не было указано для столбца 15 'A'. – user2301990

+0

@ user2301990 Вы проверили полный код вслепую, не комментируете. Я использовал функцию Window для удаления дубликатов в подборе, и ошибка возникает из-за того, что я пропустил псевдоним 'check_in_by' в sub select. Вы должны уметь исправлять эти ошибки. Обновлен ответ –

+0

извините, был занят другими вещами - он отлично работает, когда я на самом деле использовал допустимое имя столбца - до сих пор у меня было только «0» в качестве значения для check_in_by ... поэтому я просто изменил это на имя столбца и он работает отлично. Спасибо и извините за комментарий без проверки;) – user2301990

Смежные вопросы