Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择最新记录_Sql_Sql Server 2008 - Fatal编程技术网

SQL选择最新记录

SQL选择最新记录,sql,sql-server-2008,Sql,Sql Server 2008,我正在尝试根据订单表中记录的最新状态选择一组记录。状态保存在另一个名为orderStatus的表中。我的表更复杂,但这里有一个基本示例 表格-订单: orderID 表格-订单状态: orderStatusID orderID orderStatusCode dateTime 一个订单可以有很多状态记录,我只想得到订单的最新状态码。问题是我得到了很多复制品。这里有一个基本的例子 select orders.orderID from orders inner join orderS

我正在尝试根据订单表中记录的最新状态选择一组记录。状态保存在另一个名为orderStatus的表中。我的表更复杂,但这里有一个基本示例

表格-订单:

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;