我在桌子上有以下独特的约束:
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字段,我想通过只选择不同的项目,我的查询是正确的。
任何人都可以提供任何帮助吗?
答案 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
是否存在重复值,其他列是否会使行不同?