作为一个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不匹配。
提前致谢!
史蒂夫
答案 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或带时区)。