0

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

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

Order table
ID    Order_Number    Status    Order_Date    ect

Order_Status table
StatusTo    StatusFrom    Order_ID    StatusChange_Date

子表可以有许多实体用于单个父订单的状态更改。

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

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

提前致谢!

史蒂夫

4

2 回答 2

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 或时区)。
于 2012-08-03T16:05:01.353 回答
0

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

例如

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
于 2012-08-03T14:26:03.053 回答