我有两张桌子。任务和类别。
TaskID不是主键,因为存在重复值。当为特定任务选择了多个联系人时,taskid和其他详细信息将被复制。我写了查询:
SELECT Priority, Subject, Status, DueDate, Completed, Category
FROM Task, Categories
WHERE Categories.CategoryID=Task.CategoryID;
现在为该任务选择了多个联系人,对于taskid = T4,有两个记录(以灰色突出显示)。我曾尝试在ms access 2003中使用distinct,但它不起作用。我想显示不同的记录。 (这里没有要求显示taskid)如果我写:
select priority, distinct(subject), .......
并保持与上述查询中提到的相同,然后它给我一个错误。我也尝试过distinctrow.But没有成功。如何在ms访问中获取不同的值?
答案 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的所有查询功能对结果进行筛选,排序或分组。