2017-04-16 46 views
0

具有訂單的表具有包含位置的另一個表。我希望訂單表顯示,但只有最新的位置。下面是我想要展示的3排圖片。休息。SELECT語句中基於另一個表省略行

enter image description here

SELECT DispatchTable.ordernumber, DispatchTable.truck, 
     DispatchTable.driver, DispatchTable.actualpickup, 
     DispatchTable.actualdropoff, orders.pickupdateandtime, 
     orders.dropoffdateandtime, Truck002.lastposition, 
     Truck002.lastdateandtime 
FROM DispatchTable 
INNER JOIN orders ON DispatchTable.ordernumber = orders.id 
INNER JOIN Truck002 ON DispatchTable.truck = Truck002.name 
WHERE (orders.status = 'onRoute') 
+0

如何C#這裏涉及?標籤似乎不是必要的。 –

+0

我的項目使用C#,很抱歉。顯然這個問題不是。第一次在這個網站發佈。感謝您的答覆。 – Michael

回答

1

假設你想要具有用於卡車name最新lastdateandtime行,這應該工作:

SELECT DispatchTable.ordernumber, 
     DispatchTable.truck, 
     DispatchTable.driver, 
     DispatchTable.actualpickup, 
     DispatchTable.actualdropoff, 
     orders.pickupdateandtime, 
     orders.dropoffdateandtime, 
     TruckLatest.lastposition, 
     TruckLatest.lastdateandtime 
    FROM DispatchTable 
INNER JOIN orders ON DispatchTable.ordernumber = orders.id 
INNER JOIN (SELECT name, 
        lastposition, 
        lastdateandtime 
       FROM Truck002 Truck1 
       WHERE lastdateandtime = 
        (SELECT MAX(lastdateandtime) 
         FROM Truck002 Truck2 
         WHERE Truck2.name = Truck1.name)) TruckLatest 
     ON DispatchTable.truck = TruckLatest.name 
WHERE (orders.status = 'onRoute') 
+0

謝謝菲爾。 – Michael

0

如果我理解正確的話,你可以使用ROW_NUMBER()獲得最新的卡車記錄:

SELECT dt.ordernumber, dt.truck, 
     dt.driver, dt.actualpickup, 
     dt.actualdropoff, o.pickupdateandtime, 
     o.dropoffdateandtime, t.lastposition, 
     t.lastdateandtime 
FROM DispatchTable dt INNER JOIN 
    orders o 
    ON dt.ordernumber = o.id INNER JOIN 
    (SELECT t.*, 
      ROW_NUMBER() OVER (PARTITION BY t.name ORDER BY t.lastdateandtime DESC) as seqnum 
     FROM Truck002 t 
    ) t 
    ON dt.truck = t.name 
WHERE o.status = 'onRoute' AND seqnum = 1; 
+0

這工作出色。很抱歉混淆表名。 – Michael

0

首先,你爲什麼要使用Truck002name領域,而不是其id字段作爲鏈接到DispacthTable?與使用id(這是一個數字字段或比name更短的字符串)相比,這被認爲是一種效率較低的方法。

其次,你應該在你的問題提的是每個Order可以有很多DispatchTable的,並且每個DispacthTable可以有很多Truck002的,否則很多人會通過假設它是圓DispatchTableTruck002之間的另一種方式開始。

第三,請嘗試...

SELECT DispatchTable.ordernumber, 
     DispatchTable.truck, 
     DispatchTable.driver, 
     DispatchTable.actualpickup, 
     DispatchTable.actualdropoff, 
     orders.pickupdateandtime, 
     orders.dropoffdateandtime, 
     Truck002.lastposition, 
     Truck002.lastdateandtime 
FROM DispatchTable 
INNER JOIN orders ON DispatchTable.ordernumber = orders.id 
INNER JOIN Truck002 ON DispatchTable.truck = Truck002.name 
WHERE (orders.status = 'onRoute') 
GROUP BY ordernumber 
HAVING lastdateandtime = MAX(lastdateandtime) 

如果您有任何問題或意見,然後請隨時據此發佈評論。

進一步閱讀

https://msdn.microsoft.com/en-us/library/bb177906(v=office.12).aspx(上HAVING

https://www.w3schools.com/sql/sql_having.asp(上HAVING

https://msdn.microsoft.com/en-us/library/bb177905(v=office.12).aspx(上GROUP BY

https://www.w3schools.com/sql/sql_groupby.asp(上GROUP BY

+0

是的,我道歉,Truck002是一個可怕的表名。我打算爲每輛卡車製作一張新桌子。但現在我所有的卡車都使用Truck002。一旦我找出這條SQL語句,我會盡快更改這個表名。非常感謝您的鏈接。 – Michael

相關問題