2011-04-26 12 views
6

Tengo dos tablas. Tarea y categorías.cómo usar distinct en ms acceso

Task Table

Categories Table

TaskID no es una clave principal, ya que hay duplicado values.When hay múltiples contactos son seleccionados para una tarea específica, TaskID y otros detalles serán duplicated.I escribió la consulta :

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

Query Result

Ahora, como múltiple los contactos se seleccionan para esa tarea, para taskid = T4, hay dos registros (resaltados con gris). He intentado usar distinct en ms access 2003 pero no funciona. Quiero mostrar registros distintos (Aquí no hay ningún requisito para mostrar taskid) Si escribo:

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

y permaneciendo mismos que los mencionados en la consulta anterior, entonces su darme un error. He intentado distinguir también. Pero no tuve éxito. ¿Cómo obtener valores distintos en ms access?

+0

¿Cuál es el PK de su tabla de tareas? –

Respuesta

8

Bien. Está trabajando de esta manera.

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

no me gusta usar SELECT DISTINCT, he encontrado que hace que mi código de tomar más tiempo para compilar. La otra forma en que lo hago es usando GROUP BY.

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

No tengo VBA en este momento pero esto debería funcionar también.

1

El uso de SELECT DISTINCT funcionará para usted, pero la mejor solución sería cambiar el diseño de su base de datos.

Los registros duplicados pueden dar lugar a datos inconsistentes. Por ejemplo, imagine tener dos estados diferentes en diferentes registros con el mismo TaskID. ¿Cuál estaría en lo cierto?

Un diseño mejor sería incluir algo así como una tabla de tareas, una mesa de contacto y una tabla de asignación, de la siguiente manera (los campos entre paréntesis son los PK):

Tareas: [TaskID], TaskPriority, Asunto, Estado , DueDate, Completado, StartDate, propietario, CategoryID, Contact ID, ...

Contacto: [ID], nombre, apellido, dirección, Fax, ...

Asignación: [TaskID, ContactID]

Luego, puede recuperar las tareas con imple SELECCIONAR de las tablas de Tareas. Y cada vez que necesita saber los contactos asignados a unas tareas, por lo que haría uso de la cláusula JOIN, como esto

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 

o similares. Puede filtrar, ordenar o agrupar los resultados usando toda la potencia de consulta de SQL.

Cuestiones relacionadas