編輯1(說明):謝謝你到目前爲止的答案!迴應令人欣慰。
我想澄清一點問題,因爲根據答案我認爲我沒有正確描述問題的一個方面(而且我確定這是我的錯,因爲即使對我自己也難以定義它)。
這裏的問題:結果集應該只包含tstamp BETWEEN'2010-01-03'和'2010-01-09'的記錄,以及一個記錄,其中第一個order_num的tstamp爲NULL設置(有總是是一個與每個order_num爲空tstamp)。
到目前爲止給出的答案似乎包括所有記錄爲某一order_num如果有任何與tstamp BETWEEN'2010-01-03'和'2010-01-09'。例如,如果另一條記錄的order_num = 2和tstamp = 2010-01-12 00:00:00,則應將而不是包含在結果中。比使用「A UNION(B in A)」更高效的SQL?
原始問題:
考慮包含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的記錄(包括具有NULL tstamp的記錄),對於每個order_num WHERE至少有一個order_num具有tstamp NOT NULL AND tstamp BETWEEN'2010-01-03' AND'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(以A-B)」,但它慢慢地執行,我希望有是一種更有效的解決方案:
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');
我很好奇提供的查詢的性能,也許你可以分享測試結果? – 2010-01-22 21:38:53
我會盡快報告最終解決方案的性能改進情況 - 這很重要。 – machinatus 2010-01-25 15:03:21