2010-11-02 107 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,其他列使行不同?