2013-11-21 33 views
1

我有一個數據庫訪問,我登錄地圖,我借出。因此,我有一個名爲MapsOut的表,其中包含字段,MapNum(地圖ID),MapName(地圖名稱),CheckOut(地圖借出日期),CheckIn(返回地圖日期)。只顯示訪問查詢中的最後一個副本

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 

我已經做了查詢,但我不能讓SELECT 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]

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

的最新條目返回

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

,我們可以使用它作爲一個子查詢返回其餘字段爲每個那些行中,但只有當[簽入]不爲空

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 

返回

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

馬上就工作了!我之前用子查詢遺漏了Inner Join – 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; 

這應該給你想要的東西。 內部查詢獲取具有最新結帳日期的記錄,即他的簽入不爲空。其餘的只是一個地圖加入。

sqlfiddle demo in sql-server

注:該演示是在SQL服務器,但我看不出有任何理由它不會在訪問工作。

相關問題