如何在MS Access中使用DISTINCT

9
我有两个表,一个是任务表(Task),另一个是分类表(Categories)。
任务表的结构如下图所示: Task Table 由于存在重复值,因此TaskID不是主键。当为特定任务选择多个联系人时,TaskID和其他细节将会被复制。我编写了以下查询语句:
SELECT Priority, Subject, Status, DueDate, Completed, Category
FROM Task, Categories
WHERE Categories.CategoryID=Task.CategoryID;

查询结果

现在由于为该任务选择了多个联系人,对于任务id=T4,存在两条记录(用灰色标出)。我已经尝试在MS Access 2003中使用distinct,但它不起作用。我想要显示不同的记录。(这里没有显示taskid的要求)如果我写:

select priority, distinct(subject), .......

如果我按照上面的查询方式继续操作,它会给我一个错误提示。我已经尝试过使用distinctrow,但没有成功。如何在MS Access中获取不同的值?


你的任务表的主键是什么? - David-W-Fenton
3个回答

10
好的。它是这样工作的。
SELECT DISTINCT Task.Priority, Task.Subject, Task.Status, Task.DueDate, 
Task.Completed, Categories.Category
FROM Task, Categories
WHERE (((Categories.CategoryID)=[Task].[CategoryID]));

5

我不喜欢使用SELECT DISTINCT,因为我发现这会使我的代码编译时间更长。另一种方法是使用GROUP BY。

    SELECT Priority, Subject, Status, DueDate, Completed, Category
    FROM Task, Categories
    WHERE Categories.CategoryID=Task.CategoryID
    GROUP BY Subject;

我现在没有启动VBA,但这个方法也应该可以。


1
如果你想用GROUP BY替换DISTINCT,你需要将所有输出字段添加到GROUP BY子句中。 - ESP32

3
使用SELECT DISTINCT可以解决问题,但在这里更好的解决方案是改变数据库设计。
重复记录可能会导致数据不一致。例如,想象一下在不同记录中具有相同TaskID的两种不同状态。哪一个才是正确的?
更好的设计应该包括一个任务表、一个联系人表和一个分配表,如下所示(方括号中的字段是主键):
任务:[TaskID]、TaskPriority、Subject、Status、DueDate、Completed、StartDate、Owner、CategoryID、ContactID、...
联系人:[ID]、姓名、姓氏、地址、电话号码、...
分配:[TaskID、ContactID]
然后,您可以从任务表中使用简单的SELECT检索任务。
每当您需要知道分配给任务的联系人时,您都可以使用JOIN子句进行查询,如下所示。
SELECT T.*, C.*
FROM TaskID as T 
  INNER JOIN Assignment as A
    ON T.TaskID = A.TaskID
  INNER JOIN Contac as C
    ON A.ContactID = C.ID

或类似。您可以使用SQL的查询功能来过滤、排序或分组结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接