3

所以我一直在环顾四周,并没有找到太多东西。我提前道歉,因为这可能是错误的做法,但事实就是如此。

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

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

我知道我在这里没有主键,所以我试图创建一个查询,它只会附加从 Excel 表中提取的唯一记录。我可以基于单个字段执行此操作,但需要帮助使我的查询仅在全名和课程名称不相同时附加它,例如

Joe Somebody, Course#1, 14feb13

Joe Somebody, Course#2, 15feb13

Joe Somebody, Course#1, 15feb13

我需要一个查询,它将前 2 行附加到表中,但由于该人已经完成了课程#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)

最后我也有一些 Is Not Null 的东西,但我认为这与问题无关。

4

2 回答 2

2

为了避免重复,最简单的方法是添加索引。在这种情况下,复合主键似乎就是答案。只需选择要包含在复合键中的所有字段,然后单击主键按钮:

添加复合主键

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

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 导入表中存在两次或已在 Access 中存在,您将收到错误:

追加错误

于 2013-02-19T11:26:25.350 回答
0

您实际上并不需要复合主键。事实上,在 Access 中有一些地方鼓励您不要使用复合主键。您可以使用简单的整数主键创建 Access 表:

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

然后,您可以从 Excel 文件中获取所有数据:

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

这将为输入 Excel 表的每一行提供一个唯一编号,并将其存储在 Access 表中。现在您需要决定如何拒绝 CourseCompletions 表中的冲突行。(以下查询仅显示您决定拒绝的记录。)如果您想拒绝同一个人在以后完成同一课程:

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

如果您想在较早的日期拒绝完成,只需将 MIN 更改为 MAX。

如果您想拒绝 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 表中的课程完成,只需将 MAX 替换为 MIN。

因此,使用整数主键为您提供了一些选择。

于 2013-02-20T05:02:26.213 回答