TSQL - 独特的问题

时间:2010-11-02 18:48:38

标签: sql-server tsql distinct

我在桌子上有以下独特的约束:

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 个答案:

答案 0 :(得分: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为假

然后,检查您插入的内容是否重复。 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 :(得分:1)

尽管令人困惑的DISTINCT(i.AccessSOE)语法是合法的,但DISTINCT适用于您选择的所有列,而不仅仅适用于i.AccessSOE,因此您可以复制这些列,只要所有选定列的组合是唯一的。

答案 2 :(得分:0)

SELECT DISTINCT返回所有列组合在一起的行,以创建不同的行。您的唯一约束会强制AccessSOE必须唯一的规则。您是否可以检查自己的数据,看看AccessSOE是否存在重复值,其他列是否会使行不同?