编辑1(澄清):感谢您迄今为止的回答!反响令人欣慰。
我想稍微澄清一下这个问题,因为根据答案,我认为我没有正确描述问题的一个方面(我确信这是我的错,因为我什至很难为自己定义它)。
问题在于:结果集应仅包含 tstamp 介于“2010-01-03”和“2010-01-09”之间的记录,以及one记录第一组中每个 order_num 的 tstamp 为 NULL 的位置(将会有always每个 order_num 的 tstamp 为空)。
到目前为止给出的答案似乎包括all某个 order_num 的记录(如果有)anytstamp 介于“2010-01-03”和“2010-01-09”之间。例如,如果有另一条记录 order_num = 2 且 tstamp = 2010-01-12 00:00:00 它应该not包含在结果中。
原问题:
考虑一个包含 id(唯一)、order_num、tstamp(时间戳)和 item_id(订单中包含的单个商品)的订单表。 tstamp 为 null,除非订单已被修改,在这种情况下,会有另一条具有相同 order_num 的记录,并且 tstamp 包含更改发生时的时间戳。
例子...
id order_num tstamp item_id
__ _________ ___________________ _______
0 1 100
1 2 101
2 2 2010-01-05 12:34:56 102
3 3 113
4 4 124
5 5 135
6 5 2010-01-07 01:23:45 136
7 5 2010-01-07 02:46:00 137
8 6 100
9 6 2010-01-13 08:33:55 105
检索在某个日期范围内已被修改一次或多次的所有订单(基于 order_num)的最有效的 SQL 语句是什么?换句话说,对于每个订单,我们需要具有相同 order_num 的所有记录(包括具有 NULL tstamp 的记录),对于每个 order_num,其中至少一个 order_num 的 tstamp NOT NULL AND tstamp BETWEEN '2010-01-03'和“2010-01-09”。我遇到困难的是“其中至少一个 order_num 的 tstamp NOT NULL”。
结果集应如下所示:
id order_num tstamp item_id
__ _________ ___________________ _______
1 2 101
2 2 2010-01-05 12:34:56 102
5 5 135
6 5 2010-01-07 01:23:45 136
7 5 2010-01-07 02:46:00 137
我想出的SQL是这样的,本质上是“A UNION (B in A)”,但它执行缓慢,我希望有一个更有效的解决方案:
SELECT history_orders.order_id, history_orders.tstamp, history_orders.item_id
FROM
(SELECT orders.order_id, orders.tstamp, orders.item_id
FROM orders
WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09')
AS history_orders
UNION
SELECT current_orders.order_id, current_orders.tstamp, current_orders.item_id
FROM
(SELECT orders.order_id, orders.tstamp, orders.item_id
FROM orders
WHERE orders.tstamp IS NULL)
AS current_orders
WHERE current_orders.order_id IN
(SELECT orders.order_id
FROM orders
WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09');