2017-04-16 47 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

相关问题