как использовать distinct в ms access

у меня есть две таблицы. Задачи и категории.

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, но не работает. Я хочу показать отчетливые записи. (Здесь нет требования показывать taskid), если я напишу:

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

и оставаясь таким же, как указано в вышеуказанном запросе, то это дает мне ошибку. Я также пробовал distinctrow.Но успеха не добился. Как получить различные значения в ms access?

3 ответов


ОК.Это работает таким образом.

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

мне не нравится использовать SELECT DISTINCT, я обнаружил, что это заставляет мой код дольше компилироваться. Другой способ сделать это-использовать GROUP BY.

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

на данный момент у меня нет VBA, но это должно работать.


использование SELECT DISTINCT будет работать для вас, но лучшим решением здесь было бы изменить дизайн вашей базы данных.

повторяющиеся записи могут привести к несогласованным данным. Например, представьте, что у вас два разных статуса в разных записях с одним и тем же TaskID. Который из них был бы прав?

лучший дизайн будет включать что-то вроде таблицы задач, таблицы контактов и таблицы назначений, как показано ниже (поля в скобках-это PK):

задачи: [Идентификатор_задачи], TaskPriority, Тема, Статус, Duedate, Которые, Завершена, Начальная Дата, Владелец, Кодтипа, Идентификатор Contactid, ...

контакт: [ID], имя, фамилия, адрес, номер телефона, ...

Назначение: [TaskID, ContactID]

затем вы можете получить задачи с помощью простого выбора из таблиц задач. И всякий раз, когда вам нужно знать контакты, назначенные задачам, вы бы сделали это, используя предложение 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.