2013-08-29 118 views
0

我想根據記錄的最新狀態從訂單表中選擇一組記錄。狀態保存在另一個名爲orderStatus的表中。我的表是比較複雜的,但這裏有一個基本的例子SQL選擇最新記錄

表 - 訂單:

orderID 

表 - orderStatus:

orderStatusID 
orderID 
orderStatusCode 
dateTime 

一個訂單可以有多個狀態記錄,我只是想獲得具有我所查詢的最新statusCode的訂單。問題是我得到很多重複。這是一個基本的例子。

select orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 

我試着做了內部查詢,選擇從日期時間下令orderStatus表中的前1。但我仍然看到相同的重複。有人能指引我如何去做這件事的正確方向嗎?

編輯:SQL Server 2008中

+0

orderStatus表中的每個orderID都有一條記錄?我猜不是,所以你需要通過orderID進行分組,然後按'dateTime'排序。 'SELECT orders.orderID FROM blablabla WHERE orderStatusCode ='PENDING'GROUP BY orders.orderID ORDER BY orderStatus.dateTime DESC' – Sal00m

+0

如果您將其限制到特定的數據庫系統(MySQL/SQL Server/Oracle/...),甚至可能最低版本,可能會有更簡單的解決方案。 –

回答

2

簡單LEFT JOIN檢查存在的順序應該這樣做就好在沒有更新的情況;

SELECT o.* 
FROM orders o 
JOIN orderStatus os 
    ON o.orderID = os.orderID 
LEFT JOIN orderStatus os2 
    ON o.orderID = os2.orderID 
AND os.dateTime < os2.dateTime 
WHERE os.orderStatusCode = 'PENDING' AND os2.dateTime IS NULL; 
0
select DISTINCT orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 

作爲替代你可以GROUP BY

select orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 
GROUP BY orders.orderID 
0
select Distinct orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' 
0

嘗試使用子選擇這樣的:

Select 
    o.* 
FROM 
    Order o inner join OrderStatus os on o.order_id = os.order_id 
Where 
    os.orderstatus_id in (SELECT max([orderstatus_id]) FROM [OrderStatus] group by [order_id]) 
    And os.staus = 'pending' 
0

嘗試子查詢日期時間?

select orders.orderID 
from orders inner join orderStatus on orders.orderID = orderStatus.orderID 
where orderStatusCode = 'PENDING' AND (dateTime)=((SELECT MAX(dateTime) From orders 
as orders2 Where orders= orders2))