TSQL - отдельный вопрос - PullRequest
       6

TSQL - отдельный вопрос

2 голосов
/ 02 ноября 2010

У меня есть следующее уникальное ограничение contstraint для таблицы:

CREATE UNIQUE NONCLUSTERED INDEX [IX_Access_AccessSOE] ON [dbo].[Access] 
(
    [AccessSOE] ASC
)

Я пытаюсь импортировать записи в эту таблицу, используя следующий запрос:

INSERT INTO Access 
  (AccessSOE, AccessName, AccessBox, AccessLocation, 
   AccessBusiness, AccessPhone, AccessFax, AccessEmail,
   LastUpdatedBy, Deleted, AccessPrimaryKey)
SELECT DISTINCT(i.AccessSOE), i.AccessName, i.AccessBox, i.AccessLocation,
       i.AccessBusiness, i.AccessPhone, i.AccessFax, i.AccessEmail,
       'Admin', 0, i.IndexNew
  FROM Access_IMPORT i
 WHERE i.AccessSOE NOT IN (SELECT a.AccessSOE FROM ACCESS a)

Однако импорт не удается,Единственное уникальное ограничение для таблицы - это поле AccessSOE, и я подумал, что, выбрав только отдельные элементы, мой запрос будет правильным.

Может ли кто-нибудь помочь?

Ответы [ 3 ]

4 голосов
/ 02 ноября 2010

Сначала , попробуйте изменить

Where i.AccessSOE not in (Select a.AccessSOE from Access a)

В

Where NOT EXISTS
    (SELECT * FROM Access a WHERE a.AccessSOE = i.AccessSOE)

Любые значения NULL здесь Select a.AccessSOE from Access a приводят к тому, что whole NOT IN будет ложным

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

SELECT COUNT(*), i.AccessSOE, i.AccessName, i.AccessBox, i.AccessLocation,
       i.AccessBusiness, i.AccessPhone, i.AccessFax, i.AccessEmail,
       'Admin', 0, i.IndexNew
  FROM Access_IMPORT i
 where NOT EXISTS
        (SELECT * FROM Access a WHERE a.AccessSOE = i.AccessSOE)
GROUP BY
      i.AccessSOE, i.AccessName, i.AccessBox, i.AccessLocation,
       i.AccessBusiness, i.AccessPhone, i.AccessFax, i.AccessEmail,
       'Admin', 0, i.IndexNew
HAVING COUNT(*) > 1
1 голос
/ 02 ноября 2010

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

0 голосов
/ 02 ноября 2010

SELECT DISTINCT возвращает строки, в которых все столбцы объединяются для создания отдельной строки.Ваше уникальное ограничение обеспечивает соблюдение правила, согласно которому AccessSOE должно быть уникальным.Можете ли вы проверить свои данные, чтобы увидеть, есть ли дублирующие значения для AccessSOE, где другие столбцы выделяют строку?

...