SQL选择最新记录
我正在尝试根据订单表中记录的最新状态选择一组记录。状态保存在另一个名为orderStatus的表中。我的表更复杂,但这里有一个基本示例 表格-订单:SQL选择最新记录,sql,sql-server-2008,Sql,Sql Server 2008,我正在尝试根据订单表中记录的最新状态选择一组记录。状态保存在另一个名为orderStatus的表中。我的表更复杂,但这里有一个基本示例 表格-订单: orderID 表格-订单状态: orderStatusID orderID orderStatusCode dateTime 一个订单可以有很多状态记录,我只想得到订单的最新状态码。问题是我得到了很多复制品。这里有一个基本的例子 select orders.orderID from orders inner join orderS
orderID
表格-订单状态:
orderStatusID
orderID
orderStatusCode
dateTime
一个订单可以有很多状态记录,我只想得到订单的最新状态码。问题是我得到了很多复制品。这里有一个基本的例子
select orders.orderID
from orders inner join orderStatus on orders.orderID = orderStatus.orderID
where orderStatusCode = 'PENDING'
我试着做一个内部查询,从orderStatus表中选择按dateTime排序的前1个。但我仍然看到同样的重复。有人能给我指出正确的方向吗
编辑:SQL server 2008
select DISTINCT orders.orderID
from orders inner join orderStatus on orders.orderID = orderStatus.orderID
where orderStatusCode = 'PENDING'
作为替代方案,您可以分组
select orders.orderID
from orders inner join orderStatus on orders.orderID = orderStatus.orderID
where orderStatusCode = 'PENDING'
GROUP BY orders.orderID
尝试使用如下所示的子选择:
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'
是否尝试对datetime进行子查询
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))
一个简单的
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;
选择o.*
从命令
加入orderStatus操作系统
ON o.orderID=os.orderID
左连接订单状态os2
在o.orderID=os2.orderID上
和os.dateTime
orderStatus表中的每个orderID都有一条记录吗?我想没有,所以您需要按orderID分组,按日期时间分组从bla中选择orders.orderID,其中orderStatusCode='PENDING'按订单分组。orderID按订单状态排序。dateTime DESC
如果您将其限制在某个数据库系统(MySQL/SQL Server/Oracle/…)甚至最低版本,可能会有更简单的解决方案。
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;