Изменить 1 (уточнение): Спасибо за ответы до сих пор! Ответ отрадный.
Я хочу немного уточнить вопрос, потому что, основываясь на ответах, я думаю, что неправильно описал один из аспектов проблемы (и я уверен, что это моя вина, так как мне было трудно определить ее даже для себя).
Вот в чем проблема: результирующий набор должен содержать ТОЛЬКО записи с tstamp МЕЖДУ '2010-01-03' И '2010-01-09' И И one запись, где tstamp IS NULL для каждого order_num в первый набор ( всегда будет один с нулевым tstamp для каждого order_num).
Ответы, представленные до сих пор, включают все записи для определенного order_num, если есть любой с tstamp МЕЖДУ '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
Каков наиболее эффективный оператор SQL для извлечения всех заказов (на основе order_num), которые были изменены один или несколько раз в течение определенного диапазона дат? Другими словами, для каждого заказа нам нужны все записи с одинаковым order_num (включая запись с нулевым tstamp), для каждого order_num, ГДЕ хотя бы один из order_num имеет tstamp NOT NULL и tstamp МЕЖДУ '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, который я придумал, - это, по сути, «СОЮЗ (B в 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');