MS Access SQL重复行?

时间:2009-06-23 17:50:31

标签: sql ms-access report

查询:

SELECT DISTINCT ([Equipment List].ID) AS Expr1, [Job Assignments].Job
FROM [Equipment List] LEFT JOIN [Job Assignments] 
    ON [Equipment List].ID = [Job Assignments].EquipmentID;

在此查询中,当且仅当我没有在select语句中添加[Job Assignments] .Job时,设备ID才是不同的。我一做到这一点就得到了很多重复。作业分配表有很多作业,但我只对[返回日期]空白或空的作业感兴趣。任何想法如何实现这一目标?我使用它作为报告,所以当我尝试使用内部SQL查询时,它给了我一个错误。这也是一个简化的查询,因为原始有多个选择。我究竟做错了什么?任何帮助将不胜感激。

更新:我希望从[作业分配]表中只选择一行。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

DISTINCT返回SELECT语句中所有列的不同组合,这就是为什么引入第二列也会引入dupes。

听起来你可以使用WHERE子句:

SELECT DISTINCT ([Equipment List].ID) AS Expr1, [Job Assignments].Job 
FROM [Equipment List] 
LEFT JOIN [Job Assignments] ON [Equipment List].ID = [Job Assignments].EquipmentID
WHERE [Job Assignments].[Date Returned] IS NULL

你不能有一个“空白”日期,所以如果你看到空白,那么你很可能没有使用日期时间类型来存储你的日期 - 在这种情况下,你需要说:

WHERE COALESCE([Job Assignments].[Date Returned], '') = ''

编辑:基于以下评论的最新解决方案:

;WITH LatestJobs
AS
(SELECT     ja.EquipmentID, ja.Job,
            ROW_NUMBER() OVER ( PARTITION BY EquipmentID 
                                ORDER BY [Date Returned] DESC) AS RowNumber
FROM        [Job Assignments] AS ja)

SELECT      el.ID AS EquipmentID, 
            lj.Job
FROM        [Equipment List] AS el
LEFT JOIN   LatestJobs AS lj ON el.ID = lj.EquipmentID
            AND lj.RowNumber = 1

答案 1 :(得分:0)

select上每个字段的数据类型是什么?如果是longchar(sql)或memo(在访问中),你将无法使用distinct函数。