MS Access查询

时间:2011-07-21 10:56:06

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

我正在使用MS访问权限。 我有一个名为CHANGES的表有列

( CNO (int) , TNO (int), DATE_C).

我想编写一个显示最近日期的SQL查询,并仅由CNO对其进行分组。但我也想展示TNO。

SELECT tno, cno, max(date_c)
FROM changes
WHERE [Date_c] In (SELECT [date_c] FROM changes  WHERE [date_c]<=[Enter date])
GROUP BY cno;

2 个答案:

答案 0 :(得分:0)

这没有任何意义。如果您要为TNO分组,则无法显示CNO相同CNO的{​​{1}}是否有所不同。如果你想显示任何TNO,你可以这样做:

SELECT FIRST(tno), cno, max(date_c)
FROM changes
WHERE [Date_c] In (SELECT [date_c] FROM changes  WHERE [date_c]<=[Enter date])
GROUP BY cno;

或者这个:

SELECT LAST(tno), cno, max(date_c)
FROM changes
WHERE [Date_c] In (SELECT [date_c] FROM changes  WHERE [date_c]<=[Enter date])
GROUP BY cno;

但通常你想要两者分组,如果你想同时显示两者。 (即使你说你不想)。

答案 1 :(得分:0)

在SQL中有大约七种方法可以做到这一点(因为总是有:)并且是Stackoverflow上经常被问到的问题。这是一个:(为了清楚起见,我省略了你的date_c <= [Enter date]参数,因为我无法测试 - 我没有使用Access接口!):

SELECT DISTINCT C1.tno, C1.cno, 
       DT1.c_most_recent_date
  FROM changes AS C1
       INNER JOIN (
                   SELECT C2.cno, 
                          MAX(C2.c_date) AS c_most_recent_date
                     FROM changes AS C2
                    GROUP
                       BY C2.cno
                  ) AS DT1 
          ON C1.cno = DT1.cno;
         AND C1.c_date = DT1.c_most_recent_date;

这是另一个:

SELECT DISTINCT C1.tno, C1.cno, 
       C1.c_date AS c_most_recent_date
  FROM changes AS C1
 WHERE NOT EXISTS (
                   SELECT *
                     FROM changes AS C2
                    WHERE C2.cno = C1.cno
                          AND C1.c_date < C2.c_date
                  );