【问题标题】:SQL Select latest recordsSQL 选择最新记录
【发布时间】:2013-08-29 15:53:16
【问题描述】:

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

表格 - 订单:

orderID

表格 - orderStatus:

 orderStatusID
 orderID
 orderStatusCode
 dateTime

一个订单可以有很多状态记录,我只是想获取我正在查询的具有最新状态代码的订单。问题是我得到了很多重复。这是一个基本示例。

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

我尝试进行内部查询以从按日期时间排序的 orderStatus 表中选择前 1 个。但我仍然看到同样的重复。有人可以为我指出正确的方向吗?

编辑:SQL Server 2008

【问题讨论】:

  • orderStatus 表中的每个 orderID 都有一条记录?我猜不是,所以你需要按 orderID 分组并按dateTime 排序。 SELECT orders.orderID FROM blablabla WHERE orderStatusCode = 'PENDING' GROUP BY orders.orderID ORDER BY orderStatus.dateTime DESC
  • 如果你把它限制在某个数据库系统(MySQL/SQL Server/Oracle/...),甚至可能是最低版本,可能会有更简单的解决方案。

标签: sql sql-server-2008


【解决方案1】:

一个简单的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;

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:
      select Distinct orders.orderID
      from   orders inner join orderStatus on orders.orderID = orderStatus.orderID
      where  orderStatusCode = 'PENDING'
      

      【讨论】:

        【解决方案4】:

        尝试使用这样的子选择:

        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'
        

        【讨论】:

          【解决方案5】:

          试试日期时间的子查询?

           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))
          

          【讨论】:

            猜你喜欢
            • 2012-03-19
            • 2020-08-22
            • 2021-12-30
            • 1970-01-01
            • 2014-09-10
            • 2021-05-16
            • 1970-01-01
            • 2019-03-02
            • 1970-01-01
            相关资源
            最近更新 更多