插入唯一的记录到MS访问2007年

问题描述:

所以我一直在环顾四周,没有发现太多。我提前道歉,因为这可能是这样做的错误方式,但它是这样。插入唯一的记录到MS访问2007年

所以我必须跟踪同事已经完成的课程。这是通过提供MS访问数据库的Excel工作表完成的。有3个字段提供给我。

全名,课程名称和完成日期。

我知道我没有主键在这里,所以我想创建一个查询,只会追加从Excel表中拉出的独特记录。它基于一个单一的领域,但需要别人帮助我查询追加它,只有当这两个姓名和课程名称都没有,例如

Joe Somebody, Course#1, 14feb13

Joe Somebody, Course#2, 15feb13

Joe Somebody, Course#1, 15feb13

同我能做到

我需要一个查询,将前两行附加到表中,但由于已经完成课程#1的人员而忽略第三行。这是我迄今为止,基本上把我的名字字段变成主键。

INSERT INTO table [Full name], [Course], [Date] 

SELECT excel_table.[Full name], excel_table.[Course], excel_table.[Date] 

FROM excel_table 

WHERE excel_table.[Full name] Not in (SELECT table.[Full Name] FROM table) 

我也有一些是不是最后的东西,但我不认为这是相关的问题。

+1

所以基本上你需要(FullName,CourseName)组合键。不知道如何在MS Access中工作,但对于MySQL我创建了一个演示http://sqlfiddle.com/#!2/8e17a/1。希望这有助于 – 2013-02-19 10:42:50

+0

它的确帮助我认为我可以使用你的代码很少调整访问。非常感谢你! – divdeamor 2013-02-19 13:41:13

最简单的方法来做到这一点,所以你不会得到重复的是添加一个索引。在这种情况下,复合主键似乎是答案。只需选择你想要包含在复合键的字段,然后单击主键按钮:

add composite primary key

你将不会被允许空值在任何包含主键字段,但只要字段的组合不匹配,每个字段中的数据可以重复。所以:

:现在

Joe Somebody, Course#1, 14feb13  <-- good 
Joe Somebody, Course#2, 15feb13  <-- good 
Joe Somebody, Course#1, 15feb13  <-- fails 
Joe SomebodyElse, Course#1, 14feb13 <-- good 

,如果你运行一个普通的追加查询,建立与查询设计窗口,你会如果记录在Excel导入表中存在两次或已经存在于访问得到一个错误error on append

+0

而上述仍然允许多个相同的全名与不同的课程?反之亦然? – divdeamor 2013-02-19 13:39:44

+0

是的,只要这两个字段的组合不同,它就会被允许。任何一个字段中的空值都将不被允许。 – Fionnuala 2013-02-19 13:43:40

+0

谢谢你。猜猜我没有完全理解主键。我认为主键会使每个字段都是独一无二的,而不是将它们结合起来。再次感谢:) – divdeamor 2013-02-19 13:52:14

您实际上并不需要复合主键。实际上在Access中有几个地方鼓励您使用而不是使用复合主键。

insert into CourseCompletions (
, FullName 
, CourseName 
, CompletionDate 
) select 
    [Full name] 
, [Course] 
, [Date] 
from excel_table; 

这将给你输入Excel表格中的每一行:

create table CourseCompletions (
    ID autoincrement primary key 
, FullName varchar(100) 
, CourseName varchar(100) 
, CompletionDate date 
); 

然后你可以从Excel文件中的所有数据吞掉:你可以用一个简单的整数主键创建Access表一个唯一的编号并将其存储在Access表中。现在您需要决定如何拒绝CourseCompletions表中的冲突行。 (以下查询仅显示您决定拒绝的而不是的记录。)如果您希望在以后的日子拒绝由同一人同一门课程的完井:

select 
    ID 
, FullName 
, CourseName 
, min(CompletionDate) 
from CourseCompletions 
group by 
    ID 
, FullName 
, CourseName; 

如果你想早日拒绝完井简单地改变最小到最大。

如果你要拒绝任何课程完成后,在Excel表格中出现较早:

select 
    cc1.ID 
, cc1.FullName 
, cc1.CourseName 
, cc1.CompletionDate 
from CourseCompletions as cc1 
inner join (
    select 
    max(ID) as WantedID 
    , FullName 
    , CourseName 
    from CourseCompletions 
    group by FullName, CourseName 
) as cc2 
on cc1.ID = cc2.WantedID; 

,拒绝当然落成,后来出现在Excel表格中,只需用MIN取代MAX。

因此,使用整数主键给你一些选项。