2010-11-02 3 views
2

У меня есть следующий уникальный contstraint defiend на столе:TSQL - Четкий Вопрос

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, и я думал, выбрав только отдельные элементы, мой запрос будет правильным.

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

+1

Какое ваше сообщение об ошибке? – JNK

+0

Невозможно вставить повторяющуюся строку ключа в объекте 'dbo.Access' с уникальным индексом 'IX_Access_AccessSOE'. – Mick

+0

Вы вставляете в чистый стол? Например. нет возможности дублировать? Если есть вероятность дублирования, то запрос NOT IN (SELECT ...) может иметь СОЮЗ с данными из целевой таблицы, чтобы избежать обмана. –

ответ

4

Первый, попробуйте изменить

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 вызвать весь НЕ ложным

Тогда, проверка у вас нет дубликатов в том, что вы используете т. 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 
+0

+1 для 'EXISTS', но может ли он иметь NULL в столбце с уникальным индексом? – JNK

+0

@ JNK: да. Допустим один, если значение NULL. 2 null values ​​= error – gbn

+1

@JNK С очевидным исключением первичных ключей не являются уникальными ограничениями 'unique' и' nullable'? –

1

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

0

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

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