2010-11-02 59 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 2010-11-02 18:50:28

+0

無法在具有唯一索引'IX_Access_AccessSOE'的對象'dbo.Access'中插入重複鍵行。 – Mick 2010-11-02 18:52:13

+0

你插入一張乾淨的桌子嗎?例如。沒有重複的機會?如果有重複的機會,那麼你不在(SELECT ...)查詢可能需要UNION與來自目標表iteself的數據以避免欺騙。 – 2010-11-02 18:56:11

回答

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導致整個 NOT IN是假

然後,檢查你沒有重複你的inser噸。 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

對於'EXISTS'爲+1,但是,他可以在具有唯一索引的列上有NULL嗎? – JNK 2010-11-02 18:55:11

+0

@JNK:是的。如果可以爲空,則爲1。 2空值=錯誤 – gbn 2010-11-02 18:56:32

+1

@JNK除了主鍵明顯的例外,是不是'獨特的'和'可空的'單獨的約束? – 2010-11-02 18:57:26

1

儘管混亂DISTINCT(i.AccessSOE)語法是合法的,則DISTINCT適用於所有你選擇,而不僅僅是i.AccessSOE列,所以你可以有那些長的重複因爲所有選定列的組合都是唯一的。

0

SELECT DISTINCT返回所有列組合在一起以創建不同行的行。您的唯一約束強制執行AccessSOE必須唯一的規則。你可以檢查你的數據,看看有沒有重複值來自AccessSOE,其他列使行不同?