2013-11-21 4 views
1

나는 대출 한 로그 맵에 액세스 할 수있는 데이터베이스를 가지고 있습니다. MapNum (지도 ID), MapName (지도 이름), CheckOut (지도가 빌린 날짜), CheckIn (지도가 반환 된 날짜) 등의 MapsOut이라는 테이블이 있습니다.액세스 쿼리에서 마지막 복제 만 표시

MapNum MapName CheckOut CheckIn 
1  London 01/02/13 07/05/13 
1  London 08/05/13 16/06/13 
1  London 19/07/13 
2  Hull 30/01/13 05/03/13 
2  Hull 06/04/13 01/05/13 
3  Derby 11/01/13 17/02/13 
3  Derby 05/09/13 06/10/13 
4  Hove 01/02/13 01/03/13 

내가 나에게 각 MapNum의 마지막 기록을 제공하는 쿼리를 작성하려면,하지만 다시 확인 된 것을 보여, 내가하는 마지막 밖으로, 그리고 가장 최근의 순서로 알고 가장 오래 전부터 CheckOut 열에. 내가 쿼리를 만든

MapNum MapName CheckOut CheckIn 
4  Hove 01/02/13 01/03/13 
2  Hull 06/04/13 01/05/13 
3  Derby 05/09/13 06/10/13 

을,하지만 여전히 중복을 같이 나는 일할 DISTINCT 선택 얻을 수없는 : 그래서 그 결과는 다음과 같아야합니다.

SELECT DISTINCT Maps.MapNum AS MapNum, Maps.MapName, Max(MapsOut1.CheckOut) AS CheckOut, MapRecords.CheckIn 
FROM (MapRecords INNER JOIN Maps ON MapRecords.MapNum = Maps.MapNum) INNER JOIN (MapsOut INNER JOIN MapsOut1 ON MapsOut.ID = MapsOut1.ID) ON Maps.MapNum = MapsOut.MapNum 
GROUP BY Maps.MapNum, Maps.MapName, MapRecords.CheckIn 
HAVING (((MapRecords.CheckIn) Is Not Null)) 
ORDER BY Maps.MapNum; 

어떤 도움이 크게 감사합니다 :

이 작동하지 않는 것입니다. 사전

+1

문제가있는 쿼리를 표시하고 누군가가 수정할 수 있습니다. – BWS

+0

방금 ​​코드 – theWolf

답변

1

MapNum MaxOfCheckOut 
------ ------------- 
    1 2013-07-19 
    2 2013-04-06 
    3 2013-09-05 
    4 2013-02-01 

우리가 서브 쿼리의 각 필드의 나머지를 반환 할 것을 사용할 수 있습니다 반환 각 [MapNum]

SELECT MapNum, Max(CheckOut) AS MaxOfCheckOut 
FROM MapData 
GROUP BY MapNum 

에 대한 최신 항목을 찾을 수 있습니다 [체크인]가 NULL이 아니고 해당 행 있지만 경우

SELECT md.MapNum, md.MapName, md.CheckOut, md.CheckIn 
FROM 
    MapData md 
    INNER JOIN 
    (
     SELECT MapNum, Max(CheckOut) AS MaxOfCheckOut 
     FROM MapData 
     GROUP BY MapNum 
    ) AS mx 
     ON md.MapNum = mx.MapNum 
      AND md.CheckOut = mx.MaxOfCheckOut 
WHERE md.CheckIn IS NOT NULL 
ORDER BY md.CheckOut DESC 

01 반환
MapNum MapName CheckOut CheckIn 
------ ------- ---------- ---------- 
    3 Derby 2013-09-05 2013-10-06 
    2 Hull  2013-04-06 2013-05-01 
    4 Hove  2013-02-01 2013-03-01 
+0

을 추가했습니다. 바로 사용할 수있었습니다! 이전에 하위 조인으로 내부 조인을 놓쳤습니다. – theWolf

0

에서

덕분에이 같은 것을보십시오 :

SELECT m.MapNum AS MapNum, 
    m.MapName AS MapName, 
    mr.CheckOut AS CheckOut, 
    mr.CheckIn AS CheckIn 
FROM maps m 
INNER JOIN (
    SELECT t1.* 
    FROM MapsRecords t1 
    LEFT JOIN MapsRecords t2 ON t1.MapNum = t2.MapNum 
    AND t1.checkOut < t2.checkOut 
    WHERE t2.checkOut IS NULL 
    AND t1.CheckIn IS NOT NULL 
) mr ON m.MapNum = mr.MapNum; 

이 당신이 원하는 무엇을 제공해야합니다. 내부 쿼리는 최신 체크 아웃 날짜가있는 레코드를 가져오고 체크 인은 null이 아닙니다. 나머지는지도와의 조인입니다.

sqlfiddle demo in sql-server

참고 :이 데모는 SQL 서버에 있지만 내가 그것을 액세스에서 작동하지 않을 아무런 이유가 없다. 쿼리 시작