如何在ms访问中使用distinct

时间:2011-04-26 09:46:26

标签: sql ms-access distinct ms-access-2003

我有两张桌子。任务和类别。

Task Table

Categories Table

TaskID不是主键,因为存在重复值。当为特定任务选择了多个联系人时,taskid和其他详细信息将被复制。我写了查询:

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

Query Result

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

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

并保持与上述查询中提到的相同,然后它给我一个错误。我也尝试过distinctrow.But没有成功。如何在ms访问中获取不同的值?

3 个答案:

答案 0 :(得分:8)

好的。就这样工作。

SELECT DISTINCT Task.Priority, Task.Subject, Task.Status, Task.DueDate, 
Task.Completed, Categories.Category
FROM Task, Categories
WHERE (((Categories.CategoryID)=[Task].[CategoryID]));

答案 1 :(得分:5)

我不喜欢使用SELECT DISTINCT,我发现它使我的代码需要更长的时间来编译。我这样做的另一种方法是使用GROUP BY。

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

我目前没有VBA,但这也应该有效。

答案 2 :(得分:2)

使用SELECT DISTINCT对您有用,但更好的解决方案是更改您的数据库设计。

重复记录可能会导致数据不一致。例如,假设在具有相同TaskID的不同记录中具有两种不同的状态。哪一个是对的?

更好的设计包括如Task表,Contact表和Assignment表,如下所示(括号中的字段为PK):

任务:[TaskID],TaskPriority,Subject,Status,DueDate,Completed,StartDate,Owner,CategoryID,ContactID,......

联系人:[ID],姓名,姓氏,地址,电话号码,......

作业:[TaskID,ContactID]

然后,您可以使用Tasks表中的简单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的所有查询功能对结果进行筛选,排序或分组。