编辑1(澄清):感谢您到目前为止的回答!反应令人欣慰。
我想稍微澄清一下这个问题,因为根据答案,我认为我没有正确描述问题的一个方面(我确信这是我的错,因为我很难为自己定义它)。
这就是问题所在:结果集应该只包含 tstamp BETWEEN '2010-01-03' AND '2010-01-09' 的记录,以及第一组中每个 order_num 的 tstamp 为 NULL 的记录(会有对于每个 order_num,始终为 1,且 tstamp 为空)。
到目前为止给出的答案似乎包括某个 order_num 的所有记录(如果有的话)带有“2010-01-03”和“2010-01-09”之间的时间戳。例如,如果有另一条记录 order_num = 2 且 tstamp = 2010-01-12 00:00:00,则不应将其包含在结果中。
原始问题:
考虑一个包含 id(唯一)、order_num、tstamp(时间戳)和 item_id(订单中包含的单个项目)的订单表。tstamp 为空,除非订单已被修改,在这种情况下,会有另一条具有相同 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)”,但是执行起来很慢,希望有更高效的解决方案:
选择 history_orders.order_id、history_orders.tstamp、history_orders.item_id 从 (选择 orders.order_id、orders.tstamp、orders.item_id 来自订单 WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09') 作为历史订单 联盟 选择 current_orders.order_id、current_orders.tstamp、current_orders.item_id 从 (选择 orders.order_id、orders.tstamp、orders.item_id 来自订单 订单.tstamp 为空) 作为 current_orders 在哪里 current_orders.order_id IN (选择订单.order_id 来自订单 WHERE orders.tstamp BETWEEN '2010-01-03' AND '2010-01-09');