还使用父数据从单个子记录(按日期排序)返回数据

时间:2012-08-03 14:06:27

标签: sql sql-server

作为一个SQL菜鸟我有一个,我假设的,关于1到多个孩子记录的基本问题。

我有一个订单表和一个Order_Status子表。

Order table
ID    Order_Number    Status    Order_Date    ect

Order_Status table
StatusTo    StatusFrom    Order_ID    StatusChange_Date

对于单个父订单,子表可以有很多内容来更改状态。

如何将以下信息作为单个记录与子表(os)的最新记录(p)一起撤回? (p.Order_Number, p.Status, p.Order_Date, os.StatusTo, os.StatusChange_Date)。

我需要知道,因为我担心最终的os.statusto与p.status不匹配。

提前致谢!

史蒂夫

2 个答案:

答案 0 :(得分:0)

您可以加入获取最新订单状态的子查询

e.g。

SELECT p.Order_Number, p.Status, p.Order_Date, os.StatusTo, os.StatusChange_Date
FROM ORDER p
LEFT  JOIN (
          SELECT StatusTo,  Order_ID, MAX(StatusChange_Date) as StatusChange_Date
          FROM Order_Status
          GROUP BY StatusTo,    Order_ID
        )  os ON os.Order_ID= p.Order_ID

答案 1 :(得分:0)

我相信这应该有效。假设您只关心那些有变化的订单,以及变更与记录的不同(应该很容易修改)。

WITH Most_Recent_Change (order_id, statusTo, changedAt, rownum) as 
     (SELECT order_id, statusTo, statusChange_date, 
             ROWNUMBER() OVER(PARTITION BY order_id
                              ORDER BY statusChange_date DESC)
      FROM Order_Status)
SELECT Order.order_number, Order.status, Order.order_date, 
       Most_Recent_Change.statusTo, Most_Recent_Change.changedAt
FROM Order
JOIN Most_Recent_Change 
ON Most_Recent_Change.order_id = Order.id
AND Most_Recent_Change.rownum = 1
AND Most_Recent_Change.statusTo <> Order.status

(会有一个SQLFiddle示例,但它现在表现得很奇怪)

请注意,您应该注意执行此操作的提交级别,否则您可能会从同时更新的行中获得误报。

其他说明:

  • 不要将保留字(如ORDER)用于标识符。这只是一般的麻烦
  • 不要为具有数据类型的列添加后缀,尤其是在将来可能会更改这些类型的情况下。我知道order_date并非以这种方式严格命名,但它危险地接近。它应该类似orderedOn(如果是严格的'太阳日'类型)或更好orderedAt(时间戳,UTC或带时区)。